sed नई लाइन वर्ण को निकालने में विफल रहता है


12

मैं sedकाफी समय से उपयोग कर रहा हूं, लेकिन यहां एक विचित्रता है जिसके साथ मैं आया था, जिसे मैं हल नहीं कर पा रहा हूं।

मुझे वास्तविक मामले के साथ अपनी समस्या बताएं।


दृश्य 1

printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard

पहले कमांड में, मैं printfआउटपुट को पाइप करता हूं xclipताकि यह क्लिपबोर्ड पर कॉपी हो जाए। अब, printfइसके विपरीत, echoडिफ़ॉल्ट रूप से एक नई पंक्ति अंत में सम्मिलित नहीं होती है। इसलिए, यदि मैं इस सामग्री को टर्मिनल में पेस्ट करता हूं, तो जो lsकमांड कॉपी की जाती है वह स्वचालित रूप से नहीं चलती है।

दूसरे में, अंत में एक नई रेखा होती है, इसलिए क्लिपबोर्ड सामग्री को चिपकाने से क्लिपबोर्ड में कमांड के चलने का भी परिणाम होता है।

यह मेरे लिए अवांछनीय है। इसलिए, मैं उपयोग करते हुए नई लाइन को हटाना चाहता था sed, लेकिन यह विफल रहा, जैसा कि नीचे दिए गए दृश्य में बताया गया है।

दृश्य # 2

echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard

क्लिपबोर्ड की सामग्री में अभी भी नई-पंक्ति है। जब मैं इसे टर्मिनल में पेस्ट करता हूं, तो कमांड अपने आप चलती है।

मैंने गाड़ी वापसी चरित्र को हटाने की भी कोशिश की \r। लेकिन नाडा। ऐसा लगता है कि मैं यहाँ कुछ बहुत ही महत्वपूर्ण / बुनियादी याद कर रहा हूँ।

जवाबों:


16

sedewlines पर \nपरिसीमन - वे हमेशा इनपुट पर निकाले जाते हैं और आउटपुट पर फिर से लगाए जाते हैं। नहीं है कभी नहीं एक \nएक में ewline चरित्र sedपैटर्न अंतरिक्ष में जो कोई संपादन कर बना दिया है की वजह से नहीं होती है। नोट: जीएनयू के अपवाद के साथ sedकी -zविधा ...

बस उपयोग करें tr:

echo ls | tr -d \\n | xclip -selection clipboard

या, बेहतर अभी तक, sedपूरी तरह से भूल जाओ :

printf ls | xclip -selection clipboard

यह सभी नई कहानियों को हटा देगा , अक्सर generate-text | xclipमामले में वांछनीय नहीं । यह उत्तर केवल अंतिम नई पंक्ति को निकालता है।
टॉम हेल

7

कई टेक्स्ट प्रोसेसिंग टूल, जिनमें सेड, न्यूलाइन वर्ण को छोड़कर, लाइन की सामग्री पर काम करते हैं। पहली बात यह है कि जब कोई लाइन संसाधित होती है तो अंत में न्यूलाइन को बंद करना होता है, फिर यह स्क्रिप्ट में कमांड्स को निष्पादित करता है, और प्रिंट करते समय यह एक अंतिम न्यूलाइन जोड़ता है। तो आप sed के साथ नईलाइन नहीं निकाल पाएंगे।

सभी नई कड़ियों को हटाने के लिए, आप trइसके बजाय उपयोग कर सकते हैं :

echo "ls" | tr -d '\n' | xclip


4

आप इसे -z विकल्प को पारित करके sed में नई सूचियों को बदल सकते हैं ।

sed -z 's/\n/ /g'

सैड मैन पेज:

-z, - एनयूएल वर्णों द्वारा अलग - अलग डेटा


यह सभी नई कड़ियों को हटा देगा , जो आमतौर पर | xclipमामले में वांछित नहीं है ।
टॉम हेल

2

अगर आप क्लिपबोर्ड में सिर्फ कमांड डाल रहे हैं

echo -n "ls " | xclip -selection clipboard

यदि आपको अतिरिक्त जटिल परिवर्तन करने की आवश्यकता है,

echo "ls  " | perl -pe 's/\n//' | xclip -selection clipboard

हम्म। चिकना घोल। मुझे लगता है कि शायद रेगेक्स के लिए पर्ल या अजगर पर जाने का समय है।
शिवाम्स

3
@ शिवम - perlऔर जब pythonदोनों सही ढंग से उपयोग किए जा सकते हैं तो दोनों की तुलना में बहुत धीमी है sed। हालांकि इसे सही ढंग से उपयोग करना सीखना प्रमुख है।
15

@mikeserv - मैं सहमत हूं; oneliner sed के लिए विशेष अद्भुत है। यदि परिवर्तन अधिक जटिल होने जा रहे हैं, तो मैं पर्ल / पायथन / गॉक पसंद करता हूं।
जोजो

1
@JJoa: आपकी प्राथमिकता आपकी खुद की है, लेकिन sedकेवल एक-लाइनर को संभालने की तुलना में कहीं अधिक कर सकते हैं, और यह संभवत: आपके द्वारा उल्लिखित किसी भी अन्य टूल की तुलना में तेजी से कर सकता है।
मोकेसर

1
@mikeserv - एक बार फिर, मैं आपसे सहमत हूँ। कुछ साल पहले मेरे पास sed (20000 s /../..//) sed में लिखी एक अनुवाद प्रणाली EN-PT थी, जो कि sed द्वारा बनाई गई थी! और यह काम किया! बाद में यह पर्ल बन गया, जिसमें एरेज़, हैश, फ़ंक्शंस, पैकेज और CPAN थे।
जेजोओ

1

केवल अंतिम नई लाइन निकालने के लिए , इसके माध्यम से पाइप करें:

sed -z '$ s/\n$//'

sed\0यदि स्ट्रीमर के NULमाध्यम से सेट किया गया है -z, तो धारा के एक अंत में जोड़ नहीं है , जबकि एक POSIX पाठ फ़ाइल बनाने के लिए (अंत में परिभाषित \n), यह हमेशा के \nबिना एक अंतिम उत्पादन होगा -z

उदाहरण के लिए:

$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender

और साबित करने के लिए कोई NULजोड़ा नहीं :

$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72                        foo.bar

कई अनुगामी नईलाइन्स निकालने के लिए , इसके माध्यम से पाइप करें:

sed -Ez '$ s/\n+$//'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.