एक नई पंक्ति के द्वारा \ n को संरचित रूप से सेड में बदलें


23

मैं GNU sed, POSIX sedऔर BSD sedके असंख्य विकल्पों के साथ भ्रमित हूँ । मैं \nइन तीन sedप्रकारों का उपयोग करते हुए न्यूलाइन वर्ण के साथ शाब्दिक को कैसे बदलूं ?


उनके पास कई अलग-अलग चीजें हैं, आप किस हिस्से को जानना चाहते हैं?
congonglm

@Gnouc मुझे लगता है कि अब यह स्पष्ट है।
अविनाश राज

1
क्या आपके पास इस प्रश्न पर एक नज़र है ?
ग्रोक्सेडा

2
आप इनपुट पर क्या होना चाहते हैं foo\\nbarया जैसे foo\\\nbar?
गिल्स एसओ- बुराई को रोकना '

अगली पंक्ति में सरल, foo \\ यह बार होगा।
अविनाश राज

जवाबों:


30
sed 's/\\n/\
/g'

प्रतिस्थापन स्ट्रिंग में रिटर्न मारने से पहले बैकस्लैश को नोटिस करें।


क्या यह सभी प्रकार की सेड के लिए काम करता है?
अविनाश राज

मेरा मानना ​​है कि यह होना चाहिए; मैंने केवल लिनक्स पर ग्नू संस्करण का उपयोग करके परीक्षण किया।
14

11
@AvinashRaj। वह पॉसिक्स है और sed1979 में यूनिक्स v7 में मूल कमांड के साथ काम किया । केवल एक जगह जहां काम नहीं हो सकता है sed, वह कुछ छीन-डाउन व्यस्त बॉक्स-आधारित लोगों की तरह गैर-पॉसिक्स छीन-डाउन कार्यान्वयन होगा । यह csh में काम नहीं करेगा, लेकिन यह csh समस्या है।
स्टीफन चेजलस

चूंकि \\nखोज भाग में उपयोग किया जाता है, इसलिए \nप्रतिस्थापन में उपयोग क्यों नहीं किया जाता है? पहले लगता है कि बाद में मौजूद है। अर्थात। क्यों नहीं$ echo '1\n2'|sed 's/\\n/\n/g'

इस मामले में, \nयह एक शाब्दिक है, जिसका अर्थ है कि यह दो वर्णों के रूप में प्रकट होता है: एब्लेसलैश और उसके बाद nएक भी न्यूलाइन वर्ण नहीं। इसलिए, बैकस्लैश को शाब्दिक बनाने के लिए दो बैकस्लैश और उसके बादn
अनएक्सपर्ट

9

चूँकि आपके पास पहले से ही आपका पोर्टेबल sedउत्तर है, मैं सिर्फ इसका उल्लेख करूँगा कि sedअगर आपको किसी तरह से नई सुर्खियों में लाने की आवश्यकता हो तो शायद ही सबसे अच्छा उपकरण है। पर्ल बहुत ही पोर्टेबल है जैसा कि sed, अधिकांश * निक्स सिस्टम पर डिफ़ॉल्ट रूप से स्थापित होता है और इससे बहुत आसानी से निपट सकते हैं:

printf '%s\n' 'aa\nbb' | perl -pe 's/\\n/\n/g'

एक और बहुत पोर्टेबल विकल्प है awk:

printf '%s\n' 'aa\nbb' | awk  '{gsub("\\\\n","\n")};1'

सोलारिस पर, मानक awk / usr / xpg4 / bin में उपयोग करने के लिए याद रखें, इन / बिन में से एक एक ऐतिहासिक है और नई स्क्रिप्ट के लिए उपयोग नहीं किया जाना चाहिए।


मैं कहता हूं कि awkसमान पोर्टेबिलिटी समस्याएं हैं (क्या मेरा awkसादा पुराना है awk, nawkया gawk?)। दरअसल, मेरे सोलारिस बॉक्स में वर्जन की कमी है gsub()। यहां मेरा वोट पर्ल ( perl -nlawe '...'स्वचालित व्यवहार का अनुमान लगाता है awk) के लिए है।
एरियलको

2
@arielCo: awkपोर्टेबिलिटी के लिए, awkउस के एक संस्करण के साथ छड़ी POSIX शिकायत है और केवल उन सुविधाओं का उपयोग करें और आपको ठीक होना चाहिए। सोलारिस पर आपको एक जैसा मिलेगा /usr/xpg4/bin/awk
स्क्रुटिनाइज़र

@terdon इस बारे में कैसे echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'?
अविनाश राज

@arielCo वास्तव में, awk पर्ल की तुलना में अधिक पोर्टेबल है। मेरा दूसरा awk दृष्टिकोण जो उपयोग नहीं करता है उसे gsub()हर जगह बस काम करना चाहिए। यहां तक ​​कि बिजीबॉक्स भी है awk
terdon

1
gsub () POSIX है (gsub, SVR3.1 में जोड़ा गया था, POSIX awk SVR4 पर आधारित है, कुछ अतिरिक्त जानकारी के लिए gawk मैनुअल देखें), gensub () GNU एक्सटेंशन है। Solaris पर अभी भी मूल aw / बिन / awk के रूप में पाया गया, समर्थन gsub () का समर्थन नहीं किया, लेकिन बहु-चरित्र FS का समर्थन नहीं किया।
स्टीफन चेज़लस

1

यदि Hसुनार खाली है तो आप भी कर सकते हैं:

sed '/\\n/G;s/\\n\(.*\)\(.\)/\2\1/;P;D'

... लेकिन uxnut का जवाब पहले से ही तेज और अधिक सरल दोनों है, इसलिए आप इसे अपनी इच्छानुसार ले सकते हैं।

एक और बाहरी संभावना:

INPUT | sed -n l | while read v ; do printf "${v%?}" ; done

लेकिन सावधान रहें, ^ जो कि सभी मानक सी-स्टाइल \बैकस्लैश \bएस्केप का अनुवाद करता है - जैसे कि एकस्पेस और \rईटर्न और \00ऑक्टल्स और व्हावेवे।



-2

आपको sed में एक समाधान की आवश्यकता है, और जो पहले से ही नीचे दिया गया है। लेकिन मैं एक और संभावना जोड़ना चाहता था कि IMHO सिर्फ आसान और तेज है,

tr -d "\n"

1
यह क्या करता है? इनपुट से सभी नई लिंक हटाएं?
mikeserv

हाँ, यह ठीक यही करता है
jpmuc

5
लेकिन क्यों? उस सवाल का क्या करना है?
mikeserv

1
यह सिर्फ "\ n" को हटाता है जब प्रश्न पूछ रहा है कि स्ट्रिंग को वास्तविक \ n "" से कैसे प्रतिस्थापित किया जाए।
spuder
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.