Stdout से पंक्ति वर्णों का अंत निकालें? एक लाइन में कई लाइनें


14

मेरे पास एक स्क्रिप्ट है जो निम्नलिखित पाठ को आउटपुट करती है। यह एक नेटोपिया 2210-02 ADSL2 मॉडेम से आउटपुट है ।

ADSL Line State:        Up
ADSL Startup Attempts:  1
ADSL Modulation:        DMT
ADSL Data Path:         Fast
Datapump Version:       DSP 7.2.3.0, HAL 7.2.1.0
SNR Margin:                   8.20        9.00 dB
Line Attenuation:            57.50       31.00 dB
Output Power:                17.09       12.34 dBm
Errored Seconds:                 0           0
Loss of Signal:                  0         476
Loss of Frame:                   0           0
CRC Errors:                  57921         416
Data Rate:                    2880        1024

मैं प्रत्येक पंक्ति के लिए अंतिम-पंक्ति वर्ण को कैसे निकाल सकता हूं? मैं चाहूंगा कि आउटपुट कुछ इस तरह दिखे (हाँ यह बदसूरत है):

ADSL Line State:        Up ADSL Startup Attempts:  1 ADSL Modulation:        DMT ADSL Data Path:         Fast Datapump Version:       DSP 7.2.3.0, HAL 7.2.1.0 SNR Margin:                   8.20        9.00 dB Line Attenuation:            57.50       31.00 dB Output Power:                17.09       12.34 dBm Errored Seconds:                 0           0 Loss of Signal:                  0         476 Loss of Frame:                   0           0 CRC Errors:                  57921         416 Data Rate:                    2880        1024 

मैंने इस तरह के कुछ समाधानों की कोशिश की, लेकिन वे काम नहीं करते हैं:

# (This simply outputs the contents of the script, unmodified)
stefanl@hosta:~/Work/Cacti $ ./script | sed -e 's/$//'

मैंने भी प्रयोग करने की कोशिश की tr। मैं निम्नलिखित कमांड की अपेक्षा कर रहा था कि प्रत्येक न्यूलाइन कैरेक्टर को स्पेस कैरेक्टर से बदल दिया जाए। यह कई लाइनों को ले जाएगा और उन्हें एक लंबी सिंगल लाइन में संयोजित करेगा। इसके बजाय, यह केवल आउटपुट की अंतिम पंक्ति प्रदर्शित करता है। यह उत्पादन की अगली पंक्ति के साथ प्रत्येक बाद की पंक्ति को अधिलेखित करने के लिए लगता है।

stefanl@hosta:~/Work/Cacti $ ./script | tr '\n' ' '
Data Rate:                    2880        1024stefanl@hosta:~/Work/Cacti $
stefanl@hosta:~/Work/Cacti $

अपडेट :

आगे की परीक्षा में, ऐसा लगता है कि प्रत्येक पंक्ति एक रिटर्न चरित्र से पहले है। यह ^Mउपयोग करते समय दिखाता है less। इसलिए, मैंने दो trबयान जोड़े । न्यूलाइन वर्णों को हटाने के लिए एक, वापसी वर्ण को हटाने के लिए एक।

./script | | tr -d '\n' | tr -d '\r'

जवाबों:


18

sedकाम नहीं करेगा (आसानी से) क्योंकि यह एक समय में लाइनों पर काम करता है; आप इसे कर सकते हैं, लेकिन इसमें पूरे इनपुट को होल्ड बफर में कॉपी करना शामिल होगा

trवास्तव में जिस तरह से आप इसे चिपकाया काम करना चाहिए; क्या आप सुनिश्चित हैं कि नए अंक हैं \n? आप उन्हें स्थान पर परिवर्तित करने के बजाय नए सिरे को हटाकर इसे थोड़ा सरल कर सकते हैं:

tr -d '\n'

दोनों tr '\n' ' 'और tr -d '\n' एक अजीब तरह से लाइन लपेटो जाएगा। मैंने परिणाम दिखाने के लिए अपना प्रश्न अपडेट किया। तो, शायद मुझे उपयोग करने की आवश्यकता है tr, लेकिन मुझे यह पता लगाने की आवश्यकता है कि इसका उपयोग कैसे करें।
स्टीफन लासवर्स्की

क्या आप इस बारे में विस्तार कर सकते हैं कि इसके बारे में क्या अजीब है? आपके प्रॉम्प्ट को उसी लाइन पर समाप्त करने का कारण है क्योंकि आउटपुट की अंतिम लाइन ठीक है क्योंकि आपने लाइन के अंत में '\ n' को हटा दिया है। यदि आप अंतिम परिणाम का वर्णन करते हैं जो आप के लिए जा रहे हैं, मुझे यकीन है कि कोई व्यक्ति उपयुक्त फ़िल्टर के साथ आएगा।
स्टीवन डी

ठीक है, मुझे लगता है कि मैं अधिक स्पष्ट हो सकता हूं। मैं इन कई लाइनों को एक लाइन में लपेटने की उम्मीद कर रहा था। मैं tr '\n' ' 'न्यूलाइन कैरेक्टर को हटाने और इसे स्पेस कैरेक्टर से बदलने की उम्मीद करूंगा , और इसलिए एक लंबी लाइन है।
स्टीफन लासिवस्की

@ संदर्भ: मैंने अपने प्रश्न को अपडेट करने के लिए चर्चा की कि मैं क्या देखने की उम्मीद कर रहा था, और वास्तव में स्क्रीन पर क्या छपा था।
स्टीफन लासिवस्की

हम्म। जब तक आपका आउटपुट \ n के साथ समाप्त नहीं होता है, तब तक आपको वह आउटपुट नहीं देना चाहिए जिसकी आप अपेक्षा कर रहे हैं। क्या आपने इसे किसी फ़ाइल में डालने की कोशिश की है और फिर पुष्टि कर रहे हैं कि लाइन रैपिंग कुछ ऐसा नहीं है जो आपका कार्यकाल आपके लिए कर रहा है?
स्टीवन डी

5

इसके अलावा tr, कुछ अन्य तरीके जिनका आप उपयोग कर सकते हैं

awk

awk '1' ORS= file

खोल

while read -r line; do printf "%s " "$line"; done <file

sed

sed -e ':a' -e 'N;s/\n/ /;ba' file

0

tr -s '\n'न्यूलाइन की एक ही घटना के साथ दोहराया न्यूलाइन वर्णों के दृश्यों को बदलने के लिए उपयोग करें ।

उदाहरण:

>>> echo -e "Squeeze\n\n\nthose\n\n\n\nnewlines\n"
Squeeze


those



newlines

2z [franck:~] $ 
>>> echo -e "Squeeze\n\n\nthose\n\n\n\nnewlines\n" | tr -s '\n'
Squeeze
those
newlines

(देखें man tr)


0

Newline वर्णों को निकालने के लिए, यह है tr -d '\n' < file। हालांकि, सभी लाइनों में शामिल होने के लिए, कि paste -sd '\0' file

tr -d '\n' गैर-पाठ आउटपुट का उत्पादन करता है क्योंकि यह एक पंक्ति को नई रेखा वर्ण से समाप्त नहीं करता है।

हटाने के लिए, सभी CR वर्ण, आप कर सकते हैं:

tr -d '\r' < file | paste -sd '\0' -

केवल उन सीआर वर्णों को हटाने के लिए जो लाइनों के अंत में हैं:

CR=$(printf '\r')
sed "s/$CR\$//" < file | paste -sd '\0' -

या awkसब कुछ के लिए उपयोग करें :

awk '{gsub(/\r$/, ""); printf "%s", $0} 
     END {if (NR) print ""}' < file

या उपयोग करें dos2unix(जो उन अनुगामी CRs को हटा देगा और Microsoft OSes से पाठ फ़ाइलों के साथ कुछ अन्य समस्याओं को भी ठीक कर देगा):

 dos2unix < file | paste -sd '\0' -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.