একটি নির্দিষ্ট লাইনে ওএসএক্স সন্নিবেশ করান


24

তাই আমি কিছুক্ষণের জন্য লিনাক্সে 'সেড' ব্যবহার করছি, তবে 'পসিক্স সেড' এবং 'জিএনইউ সেড' এর এত সামান্য পার্থক্য থাকার কারণে ওএসএক্সে এটি ব্যবহার করার চেষ্টা করতে কিছুটা অসুবিধা হয়েছে। বর্তমানে আমি একটি নির্দিষ্ট লাইন সংখ্যার পরে কীভাবে একটি পাঠ্য লাইন সন্নিবেশ করানোর জন্য লড়াই করছি। (এই ক্ষেত্রে, লাইন 4)

লিনাক্সে আমি এই জাতীয় কিছু করব:

sed --in-place "4 a\  mode '0755'" file.txt

সুতরাং ওএসএক্সে আমি এটি চেষ্টা করেছি:

sed -i "" "4 a\ mode '0755'" file.txt

তবে এটি আমাকে একটি 'কমান্ড শেষে characters এর পরে অতিরিক্ত অক্ষর' ত্রুটি প্রদান করে। কোন ধারণা এখানে কি ভুল? আমার কি টাইপ আছে? বা আমি সেড সংস্করণগুলির মধ্যে অন্য পার্থক্য বুঝতে পারছি না?


2
MacOS 10.6.8 এ কাজ না করার জন্য এটি নিশ্চিত করতে পারে। 6.0.3 ডিবিয়ান উপর সূক্ষ্ম কাজ করে।
Tink

উত্তর:


24

কঠোরভাবে বলতে গেলে, এর জন্য পসিক্স স্পেসিফিকেশনটিরsed পরে একটি নতুন লাইন প্রয়োজন a\:

[1addr]a\
text

পূর্বে বর্ণিত হিসাবে স্ট্যান্ডার্ড আউটপুটে পাঠ্য লিখুন।

এই এক-liners, ব্যাথা একটি বিট, যা সম্ভবত নিম্নলিখিত জন্য কারণ লেখার তোলে গনুহ এক্সটেনশন করার জন্য a, iএবং cকমান্ড:

জিএনইউ এক্সটেনশন হিসাবে, যদি aএবং নতুন লাইনের মধ্যে যদি একটি সাদা স্থান- \ক্রম ছাড়া অন্য কিছু থাকে , তবে এই রেখার পাঠ্যটি ব্লকের aপ্রথম লাইন হিসাবে প্রথমে অ-হোয়াইটস্পেস অক্ষর থেকে শুরু করা হয় । (এটি এক-লাইন যুক্ত স্ক্রিপ্টিংয়ে সরলীকরণ সক্ষম করে)) এই এক্সটেনশনটি ও কমান্ডগুলির সাথেও কাজ করে।ic

সুতরাং, আপনার sedসিনট্যাক্সের সাথে পোর্টেবল হওয়ার জন্য আপনাকে a\কোনওভাবে পরে একটি নতুন লাইন অন্তর্ভুক্ত করতে হবে । সবচেয়ে সহজ উপায় হ'ল কেবল একটি উদ্ধৃত নিউলাইন সন্নিবেশ করানো:

$ sed -e 'a\
> text'

( শেল প্রম্পটগুলি কোথায় $এবং >রয়েছে)। যদি আপনি দেখতে পান যে কোনও ব্যথা, bash[1] এর $' 'সি-স্টাইলটি প্রবেশের জন্য উদ্ধৃতি বাক্য গঠন রয়েছে তবে কেবল ব্যবহার করুন

sed -e 'a\'$'\n''text'

[1] এবং এমকেএস (আর 39 বি +) এবং কিছু নন-বাশ বোর্ন শেল (যেমন, ফ্রিবিএসডি 9+ তে / বিন / শ)


খুব তথ্যপূর্ণ উত্তর। বাশ উদ্ধৃতি বাক্য গঠনের ইঙ্গিতটির জন্য আপনাকে ধন্যবাদ।
সিজ্যাকসন

14

এই উত্তরে বর্ণিত হিসাবে , সেড কমান্ডগুলির মতো iএবং aএকাধিক -e "..."ধারা ব্যবহার করার সময় এটি সহায়ক । এই ধারাগুলির প্রত্যেকটিই নতুন লাইনের দ্বারা পৃথক হবে বলে বোঝা যাবে। iএবং aকমান্ড ব্যবহার করার জন্য ইনলাইন স্ক্রিপ্ট অন্যথায় sed (তারা একটি একাধিক লাইন sed স্ক্রিপ্ট ফাইল ব্যবহারের জন্য পরিকল্পিত করছি ব্যবহার প্রার্থনা কঠিন sed -f file ...)। দেখে মনে হচ্ছে আপনি কোনও -eধারাটির শেষে প্রবর্তিত অন্তর্নিহিত নিউলাইন ব্যবহার করতে পারবেন না এমন পাঠ্যটির a\রেখাটি আলাদা করতে । তবে আপনি এটি যুক্ত করতে হবে এমন পাঠ্যের লাইনটি শেষ করতে এটি ব্যবহার করতে পারেন।

এই সুনির্দিষ্ট ক্ষেত্রে, আপনি যা করার চেষ্টা করছেন তা বাস্তবে কোনও একক -e ...ধারা দ্বারা সম্পন্ন হতে পারে । আপনাকে ঠিক aকমান্ডটি সঠিকভাবে ব্যবহার করতে হবে। পসিক্স স্ট্যান্ডার্ড অনুসারে, aক এর \পরে অনুসরণ করা দরকার, তারপরে একটি নতুন লাইন অনুসরণ করা দরকার, তারপরে পরবর্তী লাইনের অবশিষ্ট অংশটি সন্নিবেশ করা হবে (কোনও নিউলাইন বা -eধারাটির শেষ না হওয়া অবধি )। সুতরাং আপনি করতে পারেন:

sed -i "" -e $'4 a\\\n'"mode '0755'" file.txt

2
আপনি যে বৈশিষ্ট্যগুলির উপর নির্ভর করছেন সেগুলি যদি Gnu-isms অনুসারে বাছাই করতে চান তবে এই পৃষ্ঠাটি সহায়তা করতে পারে: wiki.lpinelinux.org/wiki/Regex । যদিও এটি কেবল রেগেক্স বৈশিষ্ট্যগুলিতে সীমাবদ্ধ; অন্য সিড কমান্ড না।
সন্দেহভাজন জিম

5

আমি যেভাবেই ব্যবহার করেছি উদাহরণ / টিউটোরিয়াল এর উপর ভিত্তি করে জিএনইউ সেড পসিক্স সেডের চেয়ে অনেক বেশি ব্যবহৃত হয় বলে মনে হয়।

আমি খুঁজে পেয়েছি যে আমি যে কোনও ওএসএক্স মেশিন ব্যবহার করি তাতে কেবল জিএনইউ সেড ইনস্টল করা অনেক সহজ। আপনি যদি আগ্রহী হন তবে এটি করার সর্বোত্তম উপায় হ'ল হোম্রুউয়ের মাধ্যমে এটি ইনস্টল করা ।

আপনি হয় ন্যায়সঙ্গত $ brew install gnu-sed, বা সাধারণ জিএনইউ ইউটিলিটিগুলির সাথে সমস্তটি পেতে পারেন $ brew install coreutils

তারপরে আপনি যখন কোনও সিনট্যাক্স ইস্যু dateবা অন্য কোনও প্রোগ্রামের সাথে চলে যান তখন আপনি কেবল জিএনইউ সংস্করণ ব্যবহার করতে পারেন। শেষ পর্যন্ত আমি ঠিক করেছিলাম যে সবসময় জিএনইউ সংস্করণগুলি ব্যবহার করা সহজ হয় এবং আমার সিস্টেমে সংস্করণগুলির তুলনায় সেগুলি আগে রেখে দেওয়া PATH


5

পার্ল এই জাতীয় প্ল্যাটফর্ম নির্ভর নির্ভর জিএনইউ বনাম, নন-জিএনইউ বনাম "মালিকানাধীন" আইডিয়োসিঙ্ক্রিজিতে ভোগেন না। আপনি করতে পারেন:

perl -ni.old -e 'print;if ($.==4) {print "mode 0755\n"}' file

-n' option creates a loop that reads every line of the input file. Unlike its cousin-P (not used here) it doesn't automatically print every line read. The-i invokes in-place replacement. The argument to-i (viz. ".old") can be dropped or changed. It leaves a backup of the unmodified file. The -eস্ক্রিপ্ট শুরুতে ইঙ্গিত।

$.লাইন-সংখ্যা উল্লেখ করে, লাইন-1 থেকে শুরু করে। সুতরাং কমান্ড লাইনটি 'ফাইল' পড়ে এবং লাইন সংখ্যাটি 4 এর সমান হলে এটি লাইনটি প্রিন্ট করে যা আপনি ইনজেক্ট করতে চান তা অনুসরণ করে।

আমি তাড়াতাড়ি যোগ করতে চাই যে পার্ল এর শিকড়গুলি sed, এডাব্লুকে এবং সি এর কাছে ণী, তাই সাধারণ বিকল্পগুলির জন্য বাক্য গঠন ইত্যাদি ইত্যাদি খুব খাড়া শেখার বক্ররেখা নয়।


চমৎকার উত্তর! তবে আপনি এটি কিছুটা সহজ করতে পারেন। এই চেষ্টা করুন: perl -wlpi.old -e 'print "mode 0755" if $. == 5' file.txt-pসুইচ ভাল এখানে কাজ করে (যেহেতু আমরা প্রতিটি লাইন মুদ্রণ করতে চান); আমাদের " লাইন 4 পরে মুদ্রণ " থেকে " লাইন 5 এর আগে মুদ্রণ" তে যুক্তিটি পরিবর্তন করতে হবে । এবং -lস্যুইচটি এটিকে এমন করে তোলে যাতে "\ n" প্রত্যেকের সাথে স্বয়ংক্রিয়ভাবে মুদ্রিত হয় print, তাই আপনাকে এটি নিজে মুদ্রণ করতে হবে না।
জেএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.