ये, संयुक्त रूप से गुप्त, sed
आज्ञाएँ हैं। विशेष रूप से (से man sed
):
:
बी और टी कमांड के लिए लेबल लेबल।
t लेबल
यदि /// ने अंतिम इनपुट लाइन को पढ़ने के बाद से एक सफल प्रतिस्थापन किया है और अंतिम टी या टी कमांड के बाद से, तो लेबल करने के लिए शाखा; यदि लेबल छोड़ा गया है, तो स्क्रिप्ट के अंत में शाखा।
n एन पैटर्न पैटर्न में इनपुट की अगली पंक्ति को पढ़ें / जोड़ें।
तो, आपके द्वारा पोस्ट की गई स्क्रिप्ट को टूटा जा सकता है (पठनीयता के लिए जोड़े गए स्थान):
sed ':a; $!N; s/\n/string/; ta'
--- ---- ------------- --
| | | |--> go back (`t`) to `a`
| | |-------------> substitute newlines with `string`
| |----------------------> If this is not the last line (`$!`), append the
| next line to the pattern space.
|----------------------------> Create the label `a`.
असल में, यह क्या कर रहा है जैसा कि स्यूडोकोड में लिखा जा सकता है
while (not end of line){
append current line to this one and replace \n with 'string'
}
अधिक जटिल इनपुट उदाहरण के साथ आप इसे थोड़ा बेहतर समझ सकते हैं:
$ printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;$!N;s/\n/string/;ta'
line1stringline2stringline3stringline4stringline5
मुझे वास्तव में यकीन नहीं है कि !$
इसकी आवश्यकता क्यों है। जहां तक मैं बता सकता हूं, आप उसी आउटपुट को प्राप्त कर सकते हैं
printf "line1\nline2\nline3\nline4\nline5\n" | sed ':a;N;s/\n/string/;ta'