p='[:punct:]' s='[:space:]'
sed -Ee'1!{/\n/!b' -e\} \
-e's/(\n*)(.*)/ \2 \1/' \
-e"s/is[$p]?[$s]/\n&/g" \
-e"s/([^$s])\n/\1/g;1G" \
-e:c -e"s/\ni(.* )\n{3}/u\1/" \
-e"/\n$/!s/\n//g;/\ni/G" \
-e's//i/;//tc' \
-e's/^ (.*) /\1/;P;$d;N;D'
এই বিটটি sed
কেবল is
এক লাইন থেকে পরের লাইনে সংখ্যক ঘটনা ঘটায়। is
আপনি যতটা নিক্ষেপ করছেন এটি নির্ভরযোগ্যভাবে প্রতি লাইনে যতগুলি এসএস হ্যান্ডেল করা উচিত এবং এটি করার সময় এটি পুরানো রেখাগুলি বাফার করার প্রয়োজন হয় না - এটি কেবল প্রতিটি is
শব্দটির সাথে মিলিত হয় যা অন্য শব্দের অংশ নয় এটির জন্য একটি নতুন লাইন অক্ষর ধরে রাখে ।
ফলশ্রুতিটি হ'ল এটি কোনও ফাইলের মধ্যে কেবল তৃতীয় ঘটনাটি সংশোধন করবে - এবং এটি প্রতি লাইনে গণনা বহন করবে। সুতরাং যদি কোনও ফাইল মনে হয়:
1. is is isis
2. is does
... এটি মুদ্রণ করবে ...
1. is is isis
2. us does
এটি প্রথমে প্রতিটি লাইনের মাথার এবং লেজগুলিতে একটি স্থান byুকিয়ে প্রান্তের কেসগুলি পরিচালনা করে। এটি শব্দের গণ্ডিগুলি নির্ধারণ করা আরও সহজ করে তোলে।
এরপরে এটি শূন্যের পূর্বে বা স্পেসের পরে একটি বিরামচিহ্ন অক্ষরের সমস্ত ঘটনার আগে is
একটি \n
ইললাইন সন্নিবেশ করে বৈধ এসের সন্ধান করবে is
। এটি অন্য পাস করে এবং সমস্ত \n
ইওলাইনগুলি সরিয়ে দেয় যা অবিলম্বে কোনও স্থান নয় এমন চরিত্রের দ্বারা তৈরি। বামে পিছনে এই মার্কার ম্যাচ হবে is.
এবং is
কিন্তু this
বা ?is
।
এটি পরবর্তীকালে প্রতিটি চিহ্নিতকারীকে স্ট্রিংয়ের লেজের দিকে জড়ো করে - প্রতিটি \ni
লাইনের জন্য একটি লাইনে এটি \n
স্ট্রিংয়ের লেজের সাথে একটি ewline সংযোজন করে এবং এর সাথে দুটি i
বা এর সাথে প্রতিস্থাপন করে u
। যদি \n
স্ট্রিংয়ের লেজের পাশে এক সারিতে 3 টি ইলাইন থাকে তবে এটি ইউ ব্যবহার করে - অন্যথায় আমি। প্রথমবার আঃ ব্যবহার করা হয় এটিও সর্বশেষতম - প্রতিস্থাপনটি এমন একটি অসীম লুপ সেট করে যা নীচে ফোটে get line, print line, get line, print line,
এবং এইভাবে।
প্রতিটি চেষ্টা লুপ চক্রের শেষে এটি সন্নিবেশ করা স্থানগুলি পরিষ্কার করে, প্যাটার্ন স্পেসে কেবলমাত্র প্রথম উপস্থিত নিউলাইন পর্যন্ত মুদ্রণ করে এবং আবার চলে যায়।
আমি l
লুপটির মাথায় একটি uk কমান্ড যুক্ত করব :
l; s/\ni(.* )\n{9}/u\1/...
... এবং এই ইনপুটটির সাথে এটি কীভাবে কাজ করে তা একবার দেখুন:
hai this is linux.
hai this is unix.
hai this is mac.
hai this is unchanged is.
... সুতরাং এটি কি করে তা এখানে:
hai this \nis linux. \n$ #behind the scenes
hai this is linux. #actually printed
hai this \nis unix. \n\n$ #it builds the marker string
hai this is unix.
\n\n\n$ #only for lines matching the
\n\n\n$ #pattern - and not otherwise.
hai this \nis mac. \n\n\n$ #here's the match - 3 ises so far in file.
hai this us mac. #printed
hai this is unchanged is. #no look here - this line is never evaled
এটি is
প্রতি লাইন প্রতি আরও এসএস দিয়ে আরও বোধগম্য করে তোলে :
nthword()( p='[:punct:]' s='[:space:]'
sed -e '1!{/\n/!b' -e\} \
-e 's/\(\n*\)\(.*\)/ \2 \1/' \
-e "s/$1[$p]\{0,1\}[$s]/\n&/g" \
-e "s/\([^$s]\)\n/\1/g;1G;:c" \
-e "${dbg+l;}s/\n$1\(.* \)\n\{$3\}/$2\1/" \
-e '/\n$/!s/\n//g;/\n'"$1/G" \
-e "s//$1/;//tc" -e 's/^ \(.*\) /\1/' \
-e 'P;$d;N;D'
)
এটি কার্যত একই জিনিস তবে ডব্লিউ / পসিক্স বিআরই এবং মূল যুক্তি হ্যান্ডলিং।
printf 'is is. is? this is%.0s\n' {1..4} | nthword is us 12
... পায় ...
is is. is? this is
is is. is? this is
is is. is? this us
is is. is? this is
... এবং যদি আমি সক্ষম করি ${dbg}
:
printf 'is is. is? this is%.0s\n' {1..4} |
dbg=1 nthword is us 12
... আমরা এটি পুনরাবৃত্তি দেখতে পারি ...
\nis \nis. \nis? this \nis \n$
is \nis. \nis? this \nis \n\n$
is is. \nis? this \nis \n\n\n$
is is. is? this \nis \n\n\n\n$
is is. is? this is
\nis \nis. \nis? this \nis \n\n\n\n\n$
is \nis. \nis? this \nis \n\n\n\n\n\n$
is is. \nis? this \nis \n\n\n\n\n\n\n$
is is. is? this \nis \n\n\n\n\n\n\n\n$
is is. is? this is
\nis \nis. \nis? this \nis \n\n\n\n\n\n\n\n\n$
is \nis. \nis? this \nis \n\n\n\n\n\n\n\n\n\n$
is is. \nis? this \nis \n\n\n\n\n\n\n\n\n\n\n$
is is. is? this \nis \n\n\n\n\n\n\n\n\n\n\n\n$
is is. is? this us
is is. is? this is