ব্যাখ্যা সহ পরিপূরক অনেক সহায়ক বিদ্যমান উত্তরগুলির একটি ওভারভিউ :
এখানে উদাহরণগুলি সরলীকৃত ব্যবহারের ক্ষেত্রে ব্যবহার করে: কেবল প্রথম মিলিত লাইনে 'বার' দিয়ে 'ফু' শব্দটি প্রতিস্থাপন করে।
ব্যবহার করার দরুন ANSI সি-উদ্ধৃতিচিহ্ন সহ পংক্তি ( $'...'
) নমুনা ইনপুট লাইন প্রদান করতে, bash
, ksh
, অথবা zsh
শেল হিসাবে অধিকৃত হয়।
sed
শুধুমাত্র জিএনইউ :
বেন হফস্টিনের নতুন বিজ্ঞাপন আমাদের দেখায় যে জিএনইউ নীচের 2-ঠিকানা ফর্মটির জন্য POSIX নির্দিষ্টকরণের জন্য একটি এক্সটেনশান সরবরাহ করে : ( এখানে একটি স্বেচ্ছাসেবী নিয়মিত প্রকাশের প্রতিনিধিত্ব করে)।sed
0,/re/
re
0,/re/
খুব প্রথম লাইনেও রেজেক্স মেলানোর অনুমতি দেয় । অন্য কথায়: এই জাতীয় ঠিকানাটি 1 ম লাইন থেকে শুরু করে এবং মেলে এমন লাইন সহ একটি পরিসীমা তৈরি করবে re
- re
1 ম লাইনে বা পরবর্তী কোনও লাইনে ঘটে কিনা ।
- POSIX-অনুবর্তী ফর্ম সঙ্গে এই তুলনা
1,/re/
, যা একটি সীমার সৃষ্টি যে 1 ম লাইন থেকে ম্যাচ এবং লাইন সহ যে ম্যাচ re
উপর পরবর্তী লাইন; অন্য কথায়: এটি কোনও re
মিলের প্রথম ঘটনাটি সনাক্ত করবে না যদি এটি 1 ম লাইনে ঘটে থাকে এবং সর্বাধিক ব্যবহৃত রেজেক্স পুনরায় ব্যবহারের জন্য শর্টহ্যান্ডের ব্যবহারকে বাধা দেয়//
(পরবর্তী পয়েন্টটি দেখুন)। 1
আপনি যদি একটি একত্রিত যদি 0,/re/
একটি সঙ্গে ঠিকানা s/.../.../
(প্রতিকল্পন) কলের ব্যবহার করে একই রেগুলার এক্সপ্রেশন, আপনার আদেশ কার্যকরভাবে শুধুমাত্র প্রতিকল্পন পারফর্ম করবে প্রথম লাইন যে ম্যাচ re
। সর্বাধিক প্রয়োগ হওয়া নিয়মিত এক্সপ্রেশনটি পুনঃব্যবহারের জন্য
sed
একটি সুবিধাজনক শর্টকাট সরবরাহ করে : একটি খালি ডিলিমিটার জুটি//
,।
$ sed '0,/foo/ s//bar/' <<<$'1st foo\nUnrelated\n2nd foo\n3rd foo'
1st bar # only 1st match of 'foo' replaced
Unrelated
2nd foo
3rd foo
একজন POSIX-অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে শুধুমাত্র sed
এমন বাসদ (MacOS) হিসেবেsed
(এছাড়াও হবে সঙ্গে কাজ গনুহ sed
):
যেহেতু 0,/re/
ব্যবহার করা যাবে না এবং ফর্মটি 1,/re/
সনাক্ত করা যাবে না re
যদি এটি প্রথম লাইনে ঘটে থাকে (উপরে দেখুন), 1 ম লাইনের জন্য বিশেষ হ্যান্ডলিং প্রয়োজন ।
মিখাইলভিএস এর উত্তরে কৌশলটির উল্লেখ রয়েছে, এখানে একটি ਠੋম উদাহরণ দেওয়া হয়েছে:
$ sed -e '1 s/foo/bar/; t' -e '1,// s//bar/' <<<$'1st foo\nUnrelated\n2nd foo\n3rd foo'
1st bar # only 1st match of 'foo' replaced
Unrelated
2nd foo
3rd foo
বিঃদ্রঃ:
খালি রেজেক্স //
শর্টকাট এখানে দু'বার নিযুক্ত করা হয়েছে: একবার পরিসীমাটির শেষ পয়েন্টের জন্য, এবং একবার s
কল করার জন্য; উভয় ক্ষেত্রেই, রেজেক্স foo
সুস্পষ্টভাবে পুনঃব্যবহার করা হয়, যা আমাদের এটির নকল করতে না দেয়, যা সংক্ষিপ্ত এবং আরও বজায় রাখা কোড উভয়ের জন্যই তৈরি করে।
প্যাসিক্সের sed
নির্দিষ্ট ফাংশনগুলির পরে প্রকৃত নিউলাইনগুলি দরকার যেমন লেবেলের নাম বা তার বাদ পড়ার পরে যেমন t
এখানে রয়েছে; কৌশলগতভাবে স্ক্রিপ্টটিকে একাধিক -e
বিকল্পে বিভক্ত করা একটি আসল নিউলাইনগুলি ব্যবহারের বিকল্প: প্রতিটি -e
স্ক্রিপ্টের অংশ শেষ করুন যেখানে একটি নিউলাইন সাধারণত যেতে হয়।
1 s/foo/bar/
foo
সেখানে পাওয়া গেলে কেবল 1 ম লাইনে প্রতিস্থাপন করে। যদি তা হয়, t
স্ক্রিপ্টের শেষে শাখাগুলি (লাইনে থাকা অবশিষ্ট কমান্ডগুলি এড়িয়ে যায়)। ( t
কেবলমাত্র সাম্প্রতিক s
কলটি যদি একটি আসল প্রতিস্থাপন সম্পাদন করে তবে একটি লেবেলে ফাংশনটি শাখা করে ; লেবেলের অভাবে, এখানে যেমন রয়েছে, স্ক্রিপ্টের শেষটি ব্রাঞ্চ করা হয়েছে)।
যখন এটি ঘটে তখন রেঞ্জের ঠিকানা 1,//
, যা সাধারণত লাইন 2 থেকে শুরু হওয়া প্রথম ঘটনাটি খুঁজে পায় , মিলবে না এবং সীমাটি প্রক্রিয়া করা হবে না , কারণ বর্তমান লাইনটি ইতিমধ্যে থাকলে ঠিকানাটি মূল্যায়ন করা হয় 2
।
বিপরীতভাবে, সেখানে 1 ম লাইনে কোনো মিল খুঁজে পাওয়া যদি, 1,//
হবে প্রবেশ করা, এবং সত্য প্রথম ম্যাচ পাবেন।
নেট প্রভাব গনুহ সঙ্গে হিসাবে একই sed
এর 0,/re/
শুধুমাত্র প্রথম সংঘটন প্রতিস্থাপিত হয় কিনা এটা 1 ম লাইন বা অন্য কোন উপর ঘটে।
নন-রেঞ্জের পন্থা
potong এর উত্তর প্রমান লুপ কৌশল যে কাজ করার জন্য প্রয়োজন বাইপাস ; যেহেতু তিনি জিএনইউ sed
সিনট্যাক্স ব্যবহার করেন , এখানে পসিক্স-কমপ্লায়েন্ট সমতুল্য :
লুপ কৌশল 1: প্রথম ম্যাচে, প্রতিস্থাপনটি সম্পাদন করুন, তারপরে একটি লুপ প্রবেশ করুন যা কেবলমাত্র বাকী রেখাগুলি যেমন প্রিন্ট করে :
$ sed -e '/foo/ {s//bar/; ' -e ':a' -e '$!{n;ba' -e '};}' <<<$'1st foo\nUnrelated\n2nd foo\n3rd foo'
1st bar
Unrelated
2nd foo
3rd foo
লুপ কৌশল 2, কেবল ছোট ছোট ফাইলগুলির জন্য : সম্পূর্ণ ইনপুটটিকে মেমরির মধ্যে পড়ুন, তারপরে এটিতে একটি একক প্রতিস্থাপন সম্পাদন করুন ।
$ sed -e ':a' -e '$!{N;ba' -e '}; s/foo/bar/' <<<$'1st foo\nUnrelated\n2nd foo\n3rd foo'
1st bar
Unrelated
2nd foo
3rd foo
1 1.61803 কি দিয়ে ঘটে উদাহরণ প্রদান 1,/re/
সঙ্গে এবং ছাড়া একটি পরবর্তী s//
:
- sed '1,/foo/ s/foo/bar/' <<<$'1foo\n2foo'
উৎপাদনের $'1bar\n2bar'
; উদাহরণস্বরূপ, উভয় লাইন আপডেট করা হয়েছিল, কারণ লাইন সংখ্যাটি 1
প্রথম লাইনটির সাথে মেলে, এবং রেজেক্স /foo/
- রেঞ্জের শেষ - কেবলমাত্র পরবর্তী লাইনে শুরু করার জন্য তাকাতে হবে । অতএব, উভয় লাইন এই ক্ষেত্রে নির্বাচিত হয়, এবং s/foo/bar/
প্রতিস্থাপন তাদের উভয় উপর সঞ্চালিত হয়।
- sed '1,/foo/ s//bar/' <<<$'1foo\n2foo\n3foo'
ব্যর্থ : sed: first RE may not be empty
(BSD / macOS) এবং sed: -e expression #1, char 0: no previous regular expression
(GNU) সহ, কারণ, সেই সময়ে 1 ম লাইনটি প্রক্রিয়াধীন হচ্ছে ( 1
রেঞ্জটি শুরু করার জন্য লাইন নম্বরটির কারণে ), এখনও কোনও রেজেক্স প্রয়োগ করা হয়নি, তাই//
কিছুই উল্লেখ করে না।
জিএনইউ'র sed
বিশেষ 0,/re/
বাক্য গঠন ব্যতীত, কোনও লাইন নম্বর দিয়ে শুরু হওয়া যে কোনও ব্যাপ্তি কার্যকরভাবে ব্যবহারকে বিরত রাখে //
।