मैं GNU sed
, POSIX sed
और BSD sed
के असंख्य विकल्पों के साथ भ्रमित हूँ । मैं \n
इन तीन sed
प्रकारों का उपयोग करते हुए न्यूलाइन वर्ण के साथ शाब्दिक को कैसे बदलूं ?
foo\\nbar
या जैसे foo\\\nbar
?
मैं GNU sed
, POSIX sed
और BSD sed
के असंख्य विकल्पों के साथ भ्रमित हूँ । मैं \n
इन तीन sed
प्रकारों का उपयोग करते हुए न्यूलाइन वर्ण के साथ शाब्दिक को कैसे बदलूं ?
foo\\nbar
या जैसे foo\\\nbar
?
जवाबों:
sed 's/\\n/\
/g'
प्रतिस्थापन स्ट्रिंग में रिटर्न मारने से पहले बैकस्लैश को नोटिस करें।
sed
1979 में यूनिक्स v7 में मूल कमांड के साथ काम किया । केवल एक जगह जहां काम नहीं हो सकता है sed
, वह कुछ छीन-डाउन व्यस्त बॉक्स-आधारित लोगों की तरह गैर-पॉसिक्स छीन-डाउन कार्यान्वयन होगा । यह csh में काम नहीं करेगा, लेकिन यह csh समस्या है।
\\n
खोज भाग में उपयोग किया जाता है, इसलिए \n
प्रतिस्थापन में उपयोग क्यों नहीं किया जाता है? पहले लगता है कि बाद में मौजूद है। अर्थात। क्यों नहीं$ echo '1\n2'|sed 's/\\n/\n/g'
\n
यह एक शाब्दिक है, जिसका अर्थ है कि यह दो वर्णों के रूप में प्रकट होता है: एब्लेसलैश और उसके बाद n
एक भी न्यूलाइन वर्ण नहीं। इसलिए, बैकस्लैश को शाब्दिक बनाने के लिए दो बैकस्लैश और उसके बादn
चूँकि आपके पास पहले से ही आपका पोर्टेबल 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
) के लिए है।
awk
पोर्टेबिलिटी के लिए, awk
उस के एक संस्करण के साथ छड़ी POSIX शिकायत है और केवल उन सुविधाओं का उपयोग करें और आपको ठीक होना चाहिए। सोलारिस पर आपको एक जैसा मिलेगा /usr/xpg4/bin/awk
।
echo "aa\nbb" | awk '{gsub(/\\n/,"\n");}1;'
?
gsub()
हर जगह बस काम करना चाहिए। यहां तक कि बिजीबॉक्स भी है awk
।
यदि 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
ऑक्टल्स और व्हावेवे।
gnu sed
निम्नलिखित के साथ भी काम करता है:
gsed -n -e 'H;${x;s/\\n/\n/g;p;}'
आपको sed में एक समाधान की आवश्यकता है, और जो पहले से ही नीचे दिया गया है। लेकिन मैं एक और संभावना जोड़ना चाहता था कि IMHO सिर्फ आसान और तेज है,
tr -d "\n"