तेजी से जवाब
sed ':a;N;$!ba;s/\n/ /g' file
- : 'a' लेबल बनाएँ
- N अगली पंक्ति को पैटर्न स्पेस में जोड़ता है
- $! यदि अंतिम पंक्ति नहीं है , बा शाखा (लेबल) पर जाएँ 'a'
- s स्थानापन्न , / \ n / regex नई लाइन के लिए , / / एक स्थान से , / g वैश्विक मेल (जितनी बार हो सके)
चरण 1 से 3 तक लूप लूप होगा जब तक कि यह अंतिम पंक्ति तक नहीं पहुंच जाता है, सभी लाइनें पैटर्न स्पेस में फिट हो जाती हैं जहां sed सभी \ n वर्णों को प्रतिस्थापित करेगा
वैकल्पिक
सभी विकल्प, सेड के विपरीत प्रक्रिया शुरू करने के लिए अंतिम पंक्ति तक पहुंचने की आवश्यकता नहीं होगी
बैश के साथ , धीमी गति से
while read line; do printf "%s" "$line "; done < file
पर्ल के साथ , सेड -जैसी गति
perl -p -e 's/\n/ /' file
tr के साथ , sed की तुलना में तेज़ , केवल एक वर्ण द्वारा प्रतिस्थापित किया जा सकता है
tr '\n' ' ' < file
पेस्ट के साथ , त्रि -प्रकार की गति, केवल एक चरित्र द्वारा प्रतिस्थापित किया जा सकता है
paste -s -d ' ' file
awk के साथ , त्रि -जैसी गति
awk 1 ORS=' ' file
अन्य विकल्प जैसे "इको $ (<फ़ाइल)" धीमा है, केवल छोटी फ़ाइलों पर काम करता है और प्रक्रिया शुरू करने के लिए पूरी फाइल को संसाधित करने की आवश्यकता होती है।
5.10। मैं \ n एस्केप
सीक्वेंस का उपयोग करके एक नई लाइन को मैच या डिलीट क्यों नहीं कर सकता ? मैं \ n का उपयोग करके 2 या अधिक लाइनों का मिलान क्यों नहीं कर सकता?
\ N कभी भी लाइन के अंत में न्यूलाइन से मेल नहीं खाएगा क्योंकि
लाइन को
पैटर्न स्पेस में रखने से पहले न्यूलाइन को हमेशा के लिए हटा दिया जाता है। पैटर्न स्पेस में 2 या अधिक लाइनें प्राप्त करने के लिए,
'N' कमांड या कुछ समान (जैसे 'H; ...; g?') का उपयोग करें।
सैड इस तरह से काम करता है: sed एक बार में एक लाइन पढ़ता है,
समाप्त होने वाली न्यूलाइन को चॉप करता है , पैटर्न स्पेस में जो बचा है उसे डालता है जहां
सेड स्क्रिप्ट इसे संबोधित या बदल सकती है, और जब पैटर्न स्पेस
प्रिंट होता है, तो एक नई लाइन को स्टॉपआउट करने के लिए भेजता है। (या एक फ़ाइल के लिए)। यदि
पैटर्न स्पेस पूरी तरह से या आंशिक रूप से 'd' या 'D' के साथ डिलीट हो जाता है, तो ऐसे मामलों में
नईलाइन नहीं जोड़ी जाती है। इस प्रकार, स्क्रिप्ट की तरह
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
कभी काम नहीं करेगा, क्योंकि
पैटर्न स्पेस में लाइन डालने से पहले ट्रेलिंग न्यूलाइन को हटा
दिया जाता है। उपरोक्त कार्यों को करने के लिए,
इन स्क्रिप्टों में से किसी एक का उपयोग करें:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
चूंकि GNU सेड के अलावा अन्य सेड के संस्करणों में
पैटर्न बफर के आकार की सीमा होती है , यूनिक्स 'ट्र' उपयोगिता को यहां पसंद किया जाना है।
यदि फ़ाइल की अंतिम पंक्ति में एक नई रेखा होती है, तो GNU sed
आउटपुट में उस नई पंक्ति को जोड़ देगा, लेकिन अन्य सभी को
हटा देगा, जबकि tr सभी newlines को हटा देगा ।
दो या अधिक लाइनों के ब्लॉक का मिलान करने के लिए, 3 मूल विकल्प हैं:
(1) पैटर्न स्थान के लिए अगली पंक्ति को जोड़ने के लिए 'एन' कमांड का उपयोग करें;
(2)
होल्ड लाइन में वर्तमान लाइन को जोड़ने के लिए कम से कम दो बार 'H' कमांड का उपयोग करें , और फिर
x, g, या G के साथ होल्ड स्पेस से लाइनों को पुनः प्राप्त करें ; या (3)
दो निर्दिष्ट पतों के बीच की रेखाओं का मिलान करने के लिए एड्रेस रेंज (सेक्शन 3.3, ऊपर देखें) का उपयोग करें ।
विकल्प (1) और (2) एक \ n पैटर्न स्पेस में
डालेंगे , जहाँ इसे वांछित ('s / ABC \ nXYZ / वर्णमाला / छ') के रूप में संबोधित किया जा सकता है।
लाइनों के एक ब्लॉक को हटाने के लिए 'एन' का उपयोग करने का एक उदाहरण 4.13 खंड में दिखाई देता है
("मैं विशिष्ट लगातार लाइनों के ब्लॉक को कैसे हटा सकता हूं ?")। इस
उदाहरण को डिलीट कमांड को कुछ
और में बदलकर संशोधित किया जा सकता है, जैसे 'पी' (प्रिंट), 'आई' (इंसर्ट), 'सी' (चेंज), 'ए' (अपेंड),
या 'एस' (विकल्प) ।
विकल्प (3) डाल नहीं होगा एक \ पैटर्न अंतरिक्ष में n, लेकिन यह करता है
लगातार लाइनों के एक ब्लॉक से मेल खाते हैं, तो यह हो सकता है कि तुम नहीं
भी जरूरत है \ n क्या आप जो खोज रहे हैं खोजने के लिए। चूंकि GNU sed
संस्करण 3.02.80 अब इस सिंटैक्स का समर्थन करता है:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
पारंपरिक '/ यहाँ से /, / से वहाँ / {...}' श्रेणी के
पते के अलावा, यह पूरी तरह से \ n के उपयोग से बचने के लिए संभव हो सकता है।
tr
नौकरी के लिए केवल सही उपकरण है यदि किसी एकल चरित्र के लिए एकल वर्ण को प्रतिस्थापित किया जाए, जबकि ऊपर दिया गया उदाहरण दिखाता है कि एक स्थान के साथ नई रेखा को प्रतिस्थापित किया जाता है .. तो उपरोक्त उदाहरण में, tr काम कर सकता है .. लेकिन बाद में सीमित हो जाएगा।