यह sed कमांड कैसे काम करता है?


12

मैं एक टेक्स्ट फ़ाइल से एक विशिष्ट लाइन प्रिंट करने के लिए इस समाधान पर आया हूं:

sed '123!d;q' file

इस मामले में इनपुट की पहली पंक्ति के बाद sed क्यों नहीं छोड़ता है?

जवाबों:


20

अंग्रेजी में, इस sedकार्यक्रम का अर्थ है: प्रत्येक पंक्ति के लिए,

  • [ 123!] यदि वर्तमान लाइन संख्या १२३ नहीं है, तो [ d] वर्तमान लाइन को हटा दें और अगले चक्र को शुरू करें (यानी अगली पंक्ति में जाएं);
  • तब (लेकिन हम केवल इस बिंदु तक पहुंचते हैं यदि dकमांड निष्पादित नहीं किया गया था), [ q] बिना किसी और लाइनों को संसाधित किए बाहर निकलें (लेकिन हमारे मरने के थ्रू में वर्तमान लाइन का प्रिंट आउट लें)।

या यदि आप पसंद करते हैं, शेल सिंटैक्स में:

line_number=0
while IFS= read -r pattern_space; do
  line_number=$(($line_number+1))
  if [ $line_number -ne 123 ]; then       # 123!
    continue                              #   d
  fi
  echo "$pattern_space"; break            # q
  echo "$pattern_space"                   # implicit final print (never reached)
done

धन्यवाद, यह मेरे लिए भी मंजूरी दे दी। मेरी गलती यह थी कि मैं समझ !गया था कि इससे जुड़ा था d, नहीं 123
rozcietrzewiacz

@ गिल्स: ब्रेसिज़ गुम {d;q;}होना, qहर लाइन पर लागू नहीं होना चाहिए (इसलिए केवल पहले)?
एनज़ोटिब

1
@enzotib qहर उस पंक्ति पर लागू होता है जहाँ इसे क्रियान्वित किया जाता है। लेकिन जब रेखा संख्या 123 नहीं होती है, तो dकमांड निष्पादित होती है, और इसका अर्थ तुरंत अगली इनपुट लाइन पर छोड़ना है।
गिल्स एसओ- बुराई को रोकना '

क्रिस्टल स्पष्ट व्याख्या
राहुल पाटिल

अनिवार्य रूप से यह वैसा ही करता है sed -n 123p(उसी आउटपुट को प्रिंट करता है) सिवाय इसके कि यह 123 के बाद बंद हो जाता है बजाय संभावित हजारों लाइनों को संसाधित करने के कि यह कभी भी किसी भी चीज के साथ कुछ भी नहीं करेगा।
वाइल्डकार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.