मैं बीएसडी सेड को निर्देश कैसे दे सकता हूं कि एस्केप सीक्वेंस जैसे \ n और t की व्याख्या करें?


14

मेरे पास एक sed प्रतिस्थापन कमान है जिसे मैं BSD के sedसाथ-साथ GNU के साथ भी संगत करना चाहूंगा sed। विस्तारित नियमित अभिव्यक्ति एक मुद्दा नहीं है क्योंकि मुझे इस मामले में उनकी आवश्यकता नहीं है। मेरी प्राथमिक समस्या इस तरह से है कि दो की sedव्याख्या चरित्र से बचने के क्रम में है प्रतिस्थापन हैं। मेरे प्रतिस्थापन स्ट्रिंग में टैब्स और न्यूलाइन्स शामिल हैं और मैं चाहूंगा कि वे कमांड स्ट्रिंग्स में रखरखाव में आसानी के लिए दिखाई दें, हालांकि, बीएसडी sedएस्केप सीक्वेंस और जीएनयू की व्याख्या नहीं sed करता हैsedबीएसडी पर इन एस्केप अनुक्रमों की व्याख्या करने का निर्देश देने का उपयुक्त तरीका क्या है ? निम्नलिखित दो स्निपेट मेरी समस्या का प्रतीक हैं:

जीएनयू sed

echo ABC | sed 's/B/\n\tB\n'

yeilds

A
    B
C

बीएसडी sed

echo ABC | sed 's/B\n\tB\n'

पैदावार

AntBnC

स्पष्ट रूप से, \n और \tबीएसडी द्वारा भागने के दृश्यों के रूप में व्याख्या नहीं की गई हैsed

अब, मेरे सवाल पर। बीएसडी के अनुसारsed मैनपेज के :

प्रतिस्थापन स्ट्रिंग में एक नया रेखा वर्ण निर्दिष्ट करने के लिए, इसे बैकस्लैश के साथ पूर्ववर्ती करें।

क्या इसका मतलब यह है कि मुझे बैकस्लैश द्वारा एक शाब्दिक नई रूपरेखा की आवश्यकता होगी ? प्रतिस्थापन पाठ में sedभागने के क्रम की व्याख्या करने का निर्देश देने का उपयुक्त तरीका क्या है \n?


2
BSD sed GNU sed नहीं है, और मुझे नहीं लगता कि यह आउटपुट में इस तरह के पलायन का समर्थन करता है। आपको या तो शाब्दिक वर्णों को सम्मिलित करना होगा, GNU सेड को स्थापित करना होगा, या ऐसी किसी चीज़ पर स्विच करना होगा जो इस तरह के पलायन जैसे समर्थन का समर्थन करती है।
१०:११ पर jw013

@ jw013, मैं दोनों के बीच भेदभाव पर स्पष्ट हूं। GNU sed स्थापित करना एक विकल्प नहीं है। मैं दोनों के बीच पर्याप्त सामान्य आधार खोजने की उम्मीद कर रहा था कि मैं क्या कर रहा हूं sed। अंत में यह शायद awk का उपयोग करने के लिए समझ में आएगा। तो आपको क्या लगता है कि मैंने BSD sed manpage I की व्याख्या के बारे में क्या कहा?
इफिसिथ

2
हां, आपको शाब्दिक टैब और नईलाइनों का उपयोग करने की आवश्यकता होगी, और नई सुर्खियों के साथ आपको उन्हें बैकस्लैश के साथ भी पूर्ववर्ती करने की आवश्यकता है, जो मूल रूप से केवल एक लाइन-निरंतरता तंत्र है।
jw013

@ jw013, आपके शानदार उत्तरों के लिए धन्यवाद। इस बिंदु पर, रखरखाव के लिए, मैं आपकी सलाह लूंगा और awk में अपने समाधान को फिर से तैयार करूंगा।
इफिसिथ जुएल

अच्छा विकल्प - awk वर्तमान में स्वीकृत उत्तर की तुलना में बहुत बेहतर योजना है :)
jw013

जवाबों:


6

यदि आपको पोर्टेबल स्क्रिप्ट लिखने की आवश्यकता है, तो आपको POSIX मानक (उर्फ सिंगल यूनिक्स उर्फ ​​ओपन ग्रुप बेस स्पेसिफिकेशन) में सुविधाओं से चिपके रहना चाहिए । अंक 7 उर्फ ​​POSIX-1.2008 नवीनतम है, लेकिन कई प्रणालियों ने अभी तक इसे पूरा नहीं किया है। अंक 6 उर्फ ​​पोसिक्स-1.2001 सभी आधुनिक यूनियनों द्वारा प्रदान किया गया और बड़ा है।

में sed , की तरह भागने दृश्यों के अर्थ \tऔर \nनहीं पोर्टेबल, सिवाय इसके कि एक में है regex , \nएक नई पंक्ति के लिए खड़ा है। एक sआदेश के लिए प्रतिस्थापन पाठ में , \nपोर्टेबल नहीं है, लेकिन आप एक नई लाइन के लिए खड़े होने के लिए अनुक्रम बैकलैश-न्यूलाइन का उपयोग कर सकते हैं।

टैब वर्ण (या अष्ट में व्यक्त कोई अन्य वर्ण) उत्पन्न करने का एक पोर्टेबल तरीका है tr। एक शेल चर में चरित्र को स्टोर करें और इस चर को sed स्निपेट में स्थान दें।

tab=$(echo | tr '\n' '\t')
escape=$(echo | tr '\n' '\033')
embolden () {
  sed -e 's/^/'"$escape"'[1m/' -e 's/$/'"$escape"'[0m/'
}

फिर से ध्यान दें कि नए खंडों को अलग-अलग रूप से और sप्रतिस्थापन ग्रंथों में व्यक्त किए जाने की आवश्यकता है ।

आप इसके बजाय awk का उपयोग करना चाह सकते हैं । यह \oooहर स्ट्रिंग शाब्दिक में ऑक्टेल एस्केप सहित बैकस्लैश से बचने की अनुमति देता है ।


7

आप $'...'स्ट्रिंग को पास करने से पहले पलायन की व्याख्या करने के लिए बैश का उपयोग कर सकते हैंsed

बैश मैन पेज से:

   Words  of  the  form  $'string'  are  treated specially.  The word
   expands to string, with backslash-escaped characters  replaced  as
   specified  by the ANSI C standard.  Backslash escape sequences, if
   present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \nnn   the eight-bit character whose  value  is  the  octal
                 value nnn (one to three digits)
          \xHH   the eight-bit character whose value is the hexadeci-
                 mal value HH (one or two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the  dollar  sign  had
   not been present.

   A  double-quoted  string  preceded by a dollar sign ($) will cause
   the string to be translated according to the current  locale.   If
   the  current locale is C or POSIX, the dollar sign is ignored.  If
   the string is translated and replaced, the replacement is  double-
   quoted.

3

यह स्टैक ओवरफ्लो पर जवाब दिया गया है:

/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed

यह वास्तव में बहुत क्या jw013 ने कहा है।

शाब्दिक टैब प्रकार ctrl+ सम्मिलित करने के लिए VTab


संदर्भ के लिए धन्यवाद। मुझे नफरत है कि मेरी Google खोजों ने उस लिंक को वापस नहीं किया: D
ephsmith

1
Ctrl-V टैब सुझाव शेल-निर्भर है, उदाहरण के लिए यह मछली में काम नहीं करेगा।
औरदाम

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