का अर्थ क्या है: ए; $; एन; एक कमांड में?


11
$ (echo hello; echo there) | sed ':a;$!N;s/\n/string/;ta'
hellostringthere

उपरोक्त sedकमांड स्ट्रिंग "स्ट्रिंग" के साथ नई पंक्ति वर्ण को प्रतिस्थापित करता है। लेकिन मैं :a;$!N;s/\n/string/;taएकल उद्धरण के भीतर का अर्थ नहीं जानता । मैं बीच का हिस्सा जानता हूं s/\n/string/। लेकिन मैं पहले ( :a;$!N;) और अंतिम ( ta) भाग के कार्य को नहीं जानता ।



पिछले भाग के बारे में क्या?
अविनाश राज

"T" कमांड शाखाओं का नाम एक लेबल पर देता है यदि अंतिम स्थानापन्न कमांड संशोधित पैटर्न स्पेस।
xiaodongjie

जवाबों:


17

ये, संयुक्त रूप से गुप्त, 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'

1
! $ अंतिम न्यूलाइन, IMO से मेल नहीं खाता है।
ब्रिअम

@Braiam भी उस बारे में निश्चित नहीं है, यह $!नहीं है !$। हालाँकि, यह भी हो सकता है !Nऔर नहीं भी $!
टेराडन

मैं texinfo पेज पार्स करने के लिए कोशिश कर रहा था, लेकिन करने के लिए न तो संदर्भ नहीं मिला था !Nया $!। इसलिए, मैं अभी भी अपनी सोच रखता हूं कि यह देख रहा है कि अंतिम पंक्ति नईलाइन या ईओएफ है या नहीं।
ब्राह्मण

4
मैं $!एक पोस्टफिक्स सप्लीमेंट ऑपरेटर के साथ एक पता 'रेंज' के रूप में सोचने की कोशिश करता हूं - इसलिए $!N( Nपते को छोड़कर हर जगह करते हैं $) वास्तव में कुछ के समान सिंटैक्स है m,n!d( जैसे लाइनों mको छोड़कर सब कुछ हटा दें n)।
स्टीलड्राइवर

:gotoलेबल का एनालॉग है , और वास्तव में थॉम्पसन शेल में गोटो लेबल का :उपयोग किया जाता है , इसलिए यह दिन में वापस आने वाले लोगों को सीड और थॉम्पसन शेल दोनों का उपयोग करने के लिए परिचित होगा
सर्गी कोलोडियाज़नी

0

मैं इस उत्तर पोस्ट के बाद से मैं के बारे में भ्रम का एक बहुत देखते हैं क्यों अंतिम पंक्ति बाहर रखा गया है जब क्रियान्वित N(लाइन को संबोधित स्ट्रिंग के माध्यम से $!) और क्योंकि ओपी के अर्थ के बारे में भ्रमित किया गया था :a;$!N; में एक sed आदेश , न केवल में विशिष्ट एक वह तैनात ।

खैर, $!Nइसके बजाय का उपयोग करने का लाभ Nप्रस्तावित उदाहरणों में नहीं है (ओपी द्वारा और @terdon द्वारा), क्योंकि कोई "महत्वपूर्ण" (पढ़ते रहें) कमांड कमांड के बाद अंतिम पंक्ति पर किया जाता है N। (वास्तव में, परिणाम एक ही होता है यदि कोई स्ट्रिप लाइन को बंद करता है।)

अधिक जटिल उदाहरण में (उदाहरण के लिए, this sentenceकिसी फ़ाइल में स्थानापन्न , दो शब्दों के साथ कभी-कभी एक लाइन पर और कुछ दूसरी बार दो लाइनों पर दिखाई देता है), Nकमांड के लिए अंतिम पंक्ति को छोड़कर महत्वपूर्ण हो सकता है! अंतिम पंक्ति शामिल नहीं है, तो क्रियान्वित करने पर Nउस पर, sedहिट EOFऔर बाहर निकलता है तुरंत बाद के सभी आदेश (आदेशों शाखाओं के साथ-साथ, अर्थात् को रोकने, tऔर b) निष्पादित किया जाना है।

दिखाए गए बहुत ही सरल उदाहरणों में, हम सुरक्षित रूप से हटा सकते हैं $!और sedक्रियान्वित करने में विफल हो सकते हैं Nऔर वापस लौट सकते हैं क्योंकि निरस्त sकमांड कुछ भी नहीं करेगा यदि इसे निष्पादित किया गया था, क्योंकि \nमैच नहीं करना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.