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
यह पहले हर पंक्ति के सिर और पूंछ पर एक स्थान डालकर किनारे के मामलों को संभालता है। इससे शब्द सीमाओं का पता लगाना थोड़ा आसान हो जाता है।
इसके बाद is
एक \n
शून्य डालने से पहले वैध ईएस के लिए लगता है कि एक जगह से is
पहले शून्य या एक विराम चिह्न वर्णों के सभी घटनाओं से पहले। यह एक और पास करता है और सभी \n
ewlines को हटा देता है जो तुरंत एक नहीं-स्थान चरित्र से पहले होते हैं। पीछे छोड़ दिया यह मार्कर से मिलान करेगा is.
और is
नहीं बल्कि this
या ?is
।
यह अगली बार प्रत्येक मार्कर को स्ट्रिंग की पूंछ पर इकट्ठा करता है - \ni
एक लाइन पर हर मैच के लिए यह स्ट्रिंग की पूंछ के लिए एक \n
इवलाइन जोड़ता है और इसे i
या तो साथ बदल देता है u
। यदि \n
स्ट्रिंग की पूंछ पर इकट्ठी एक पंक्ति में 3 इवलाइन हैं तो यह यू का उपयोग करता है - और मैं। पहली बार एयू का उपयोग किया जाता है यह भी अंतिम है - प्रतिस्थापन एक अनंत लूप को सेट करता है जो नीचे get line, print line, get line, print line,
और इतने पर उबलता है ।
प्रत्येक कोशिश लूप चक्र के अंत में यह सम्मिलित स्थानों को साफ करता है, पैटर्न स्पेस में केवल पहली होने वाली न्यूलाइन तक प्रिंट करता है, और फिर से जाता है।
मैं l
लूप के सिर पर एक ook कमांड में जोड़ूंगा:
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'
)
यह व्यावहारिक रूप से एक ही बात है, लेकिन w / POSIX BRE और अल्पविकसित तर्क हैंडलिंग लिखा है।
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