2011-06-06 9 views
12

प्रस्तावना के बिना,कैसे 'एन' कमांड sed में काम करता है?

 
$ cat in.txt 
a 
b 
c 
d 
$ sed '=;N' in.txt 
1 
a 
b 
3 
c 
d 

यह हर दूसरे लाइन पर 'एन' कमांड काम करता है की तरह लग रहा है। शायद यह प्राकृतिक होगा, क्योंकि कमांड 'एन' अगली पंक्ति में शामिल होता है और वर्तमान लाइन नंबर बदलता है। लेकिन,

 
$ sed 'N;$!P;$!D;$d' thegeekstuff.txt 

(मैंने देखा कि इस here)
उपरोक्त उदाहरण एक फ़ाइल के अंतिम दो पंक्तियों को हटा देता है। यह न केवल लाइन-क्रमांकित फ़ाइल बल्कि अजीब-पंक्ति-क्रमांकित फ़ाइल भी काम करता है। तो इस उदाहरण में, 'एन' कमांड हर पंक्ति पर चलता है।
क्या अंतर है?

और क्या आप मुझे बता सकते हैं कि जब मैं इस तरह से दौड़ता हूं तो आखिरी पंक्ति क्यों नहीं देख पा रहा हूं?

info sed से
 
# sed N odd-lined-file.txt 

उत्तर

19

अंश:

`sed' operates by performing the following cycle on each lines of 
input: first, `sed' reads one line from the input stream, removes any 
trailing newline, and places it in the pattern space. Then commands 
are executed; each command can have an address associated to it: 
addresses are a kind of condition code, and a command is only executed 
if the condition is verified before the command is to be executed. 
... 
When the end of the script is reached, unless the `-n' option is in 
use, the contents of pattern space are printed out to the output 
stream, 
... 
Unless special commands (like 'D') are used, the pattern space is 
deleted between two cycles 

... 

`N' 
    Add a newline to the pattern space, then append the next line of 
    input to the pattern space. If there is no more input then `sed' 
    exits without processing any more commands. 

... 

`D' 
    Delete text in the pattern space up to the first newline. If any 
    text is left, restart cycle with the resultant pattern space 
    (without reading a new line of input), otherwise start a normal 
    new cycle. 

यह काफी आपकी क्वेरी को हल करना चाहिए। लेकिन फिर भी मैं अपने तीन अलग-अलग मामलों को समझाने की कोशिश करेंगे:

मामला 1:

  1. sed इनपुट से एक लाइन पढ़ता है। [अब पैटर्न स्थान में 1 लाइन है।]
  2. = वर्तमान पंक्ति संख्या मुद्रित करता है।
  3. N पैटर्न स्थान में अगली पंक्ति पढ़ता है। [अब पैटर्न स्थान में 2 पंक्तियां हैं।]
    • यदि पढ़ने के लिए कोई अगली पंक्ति नहीं है तो sed यहां निकलता है। [यानी: विषम रेखाओं के मामले में, sed यहां निकलता है - और इसलिए अंतिम पंक्ति छपाई के बिना निगल जाती है।]
  4. sed पैटर्न स्थान प्रिंट करता है और इसे साफ़ करता है। [पैटर्न स्थान खाली है।]
  5. यदि EOFsed यहां पहुंचे। अन्य चरण 1 से पूरे चक्र को पुनरारंभ करें। [यानी: यहां तक ​​कि रेखाओं के मामले में, यहां से बाहर निकलता है।]

सारांश: इस मामले में sed एक समय में 2 लाइनें और प्रिंट 2 लाइनें पढ़ता है। आखिरी पंक्ति निगल गई है कि वहां विषम रेखाएं हैं (चरण 3 देखें)।

केस 2:

  1. sed इनपुट से एक लाइन पढ़ता है। [अब पैटर्न स्थान में 1 लाइन है।]
  2. N पैटर्न स्थान में अगली पंक्ति पढ़ता है। [अब पैटर्न स्थान में 2 लाइनें हैं।]
    • यदि यह यहां से बाहर निकलने में विफल रहता है। यह तब होता है जब 1 लाइन हो।
  3. अपने पिछले नहीं लाइन ($!) पैटर्न अंतरिक्ष से पहली पंक्ति (P) मुद्रित है। [पैटर्न स्थान से पहली पंक्ति मुद्रित है। लेकिन अभी भी पैटर्न अंतरिक्ष में 2 लाइनें हैं।]
  4. यदि इसकी अंतिम पंक्ति नहीं है ($!) पैटर्न स्थान से पहली पंक्ति (D) हटाएं [अब पैटर्न स्थान में केवल 1 पंक्ति (दूसरा वाला) है।] और चरण 2 से कमांड चक्र को पुनरारंभ करें। और इसकी वजह से D(ऊपर उद्धरण देखें)
  5. यदि इसकी अंतिम रेखा ($) तो पूर्ण पैटर्न स्थान हटाएं (d)। [अर्थात। ईओएफ पहुंचे] [इस चरण को शुरू करने से पहले पैटर्न स्पेस में 2 लाइनें थीं जिन्हें अब d द्वारा साफ़ किया गया है - इस चरण के अंत में, पैटर्न स्थान खाली है।]
  6. sed स्वचालित रूप से ईओएफ पर बंद हो जाता है।

सारांश: इस मामले में:

  • sed पहले 2 लाइनों पढ़ता है।
  • यदि पढ़ने के लिए अगली पंक्ति उपलब्ध है, तो पहली पंक्ति मुद्रित करें और अगली पंक्ति पढ़ें।
  • अन्य कैश से दोनों पंक्तियां हटाएं। इस तरह यह हमेशा अंतिम 2 लाइन को हटा देता है।

मामला 3:
इसके डिब्बे के रूप में ही मामला: 1, बस इसे से चरण 2 को हटा दें।

+0

अच्छी तरह से, मैं इसे पूरी तरह से समझ नहीं सकता। इसका मतलब है कि 'एन' कमांड प्रत्येक पंक्ति पर चलेगा यदि केवल पैटर्न स्थान खाली नहीं है? और पैटर्न की जगह खाली होने पर हर दूसरी लाइन चलाएं? – plhn

+1

अपनी टिप्पणी को ध्यान में रखते हुए, मैंने जवाब अपडेट किया है। कृपया इसे एक बार जांचें। – ssapkota

+0

बहुत बहुत धन्यवाद !!!!!!!! – plhn

संबंधित मुद्दे