sed

2012-05-16 24 views
28

का उपयोग कर आने वाली स्ट्रीम से नए लाइन वर्ण को हटा रहा है मैं शैल स्क्रिप्टिंग के लिए नया हूं और मैं SED का उपयोग करके प्रत्येक पंक्ति से नए लाइन वर्ण को हटाने का प्रयास कर रहा हूं। मैंने अभी तक यह किया है:sed

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' 

केवल नए लाइन वर्ण को हटा देता है। मैंने कहीं यह आदेश मिला:

printf "{new\nto\nlinux}" | sed ':a;N;$!ba;s/\n/ /g' 

लेकिन यह देता है: "बा:। इवेंट नहीं मिला"

अगर मैं कार्य करें:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' | sed ':a;N;s/\n/ /g' 

तो यह सही उत्पादन देता है, लेकिन मैं कुछ बेहतर रहा हूँ के रूप में मुझे यकीन नहीं जब मैं स्क्रिप्ट चलाने मैं कितने नए चरित्र मिल जाएगा हूँ। आने वाली स्ट्रीम इको या printf या स्क्रिप्ट में कुछ चर से है। अग्रिम

+0

'बा: इवेंट नहीं मिला' त्रुटि अपने खोल से है। सीएसएच का उपयोग बंद करो, या बचें! –

+0

@WilliamPursell मुझे सीएसएस का उपयोग केवल मेरे लिए कोई अन्य विकल्प नहीं है। आपके सुझाव पर मैंने गिरा दिया! "printf" {new \ nto \ nlinux} "| sed ': a; n; $ ba; s/\ n// g'" यह आदेश भी सही परिणाम नहीं दे रहा है .. मुझे पता है कि उपयोग करने के कई नुकसान हैं csh लेकिन कुछ बाध्यता के कारण इसका उपयोग करना होगा :(..thanks –

+0

आप '!' को नहीं हटा सकते हैं, लेकिन आपको इसे बैकस्लैश से पहले करना होगा। –

उत्तर

64

धन्यवाद नई-पंक्तियों को निकालने के लिए उपयोग टीआर:

tr -d '\n' 

आप एक ही स्थान के साथ प्रत्येक न्यू लाइन बदलना चाहते हैं:

tr '\n' ' ' 

त्रुटि ba: Event not found csh से आ रही है, और सीएसएच आपकी इतिहास सूची में !ba से मिलान करने की कोशिश कर रहा है। आप ! बच सकते हैं और आदेश लिखें:

sed ':a;N;$\!ba;s/\n/ /g' # Suitable for csh only!! 

लेकिन sed इस के लिए गलत उपकरण है, और आप बेहतर होगा एक खोल कि उद्धृत तार अधिक यथोचित हैंडल का उपयोग कर जाएगा। यही है, सीएसएच का उपयोग बंद करो और बैश का उपयोग शुरू करें।

+0

आपके उत्तर के लिए धन्यवाद लेकिन आप इको या printf से आने वाली स्ट्रीम को संशोधित करने के लिए tr का उपयोग कर सकते हैं ?? –

+1

tr एक फिल्टर है। 'printf ... | tr ...' ठीक काम करेगा। –

+0

नहीं, यह अभी भी काम नहीं करता है। यहां तक ​​कि '$ \! ba' के साथ, परिणाम 'ba: ईवेंट नहीं मिला' एक सीएसएच स्क्रिप्ट से। – krb686

6

यह आप के लिए काम कर सकते हैं:

printf "{new\nto\nlinux}" | paste -sd' '    
{new to linux} 

या:

printf "{new\nto\nlinux}" | tr '\n' ' '    
{new to linux} 

या:

printf "{new\nto\nlinux}" |sed -e ':a' -e '$!{' -e 'N' -e 'ba' -e '}' -e 's/\n/ /g' 
{new to linux} 
+2

+1: पेस्ट का अच्छा उपयोग। ध्यान दें कि यहां का सशक्त समाधान (गलत) उद्धरण नियमों के कारण सीएसएस के साथ काम नहीं करेगा, और '!अभी भी बच जाना चाहिए। –

+0

या पेस्ट। हालांकि, अंत में एक डैश की जरूरत है, यह इंगित करने के लिए कि इसे stdin से पढ़ना चाहिए: 'paste -sd "" -' – Jelle

+0

tr -d "\ n" केवल मुझे stdin की अंतिम पंक्ति के साथ छोड़ देता है ..:/(मैक पर) –