मैं उसी लाइन पर मल्टीलाइन आउटपुट कैसे प्रिंट कर सकता हूं?


16

क्या एक ही लाइन पर मल्टी-लाइन आउटपुट (सिंगल आउटपुट) प्रिंट करने की विधि है?

उदाहरण के लिए, यदि आउटपुट है:

abc
def
qwerty

क्या यह प्रिंट करना संभव है:

abcdefqwerty 

जवाबों:


13

आप दिए गए सेट से वर्णों की सभी घटनाओं को हटा सकते हैं tr -d। Newline वर्ण उपयोग को हटाने के लिए:

tr -d '\n'

हमेशा की तरह आप इनपुट और आउटपुट रीडायरेक्शन और पाइप का उपयोग फ़ाइलों और अन्य प्रक्रियाओं से पढ़ने या लिखने के लिए कर सकते हैं।

आप पिछले न्यू लाइन रखना चाहते हैं तो आप बस इसके साथ वापस जोड़ सकते हैं echoया printf '\n', जैसे:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt

10

कई तरीकों से। वर्णन करने के लिए, मैंने आपका उदाहरण इसमें सहेजा है file:

$ cat file | tr -d '\n'
abcdefqwerty$ 
$ cat file | perl -pe 's/\n//'
abcdefqwerty$ 

हालांकि पिछले एक सहित सभी newline वर्णों को निकालता है। आप इसके बजाय करना चाह सकते हैं:

$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty

मुझे लगता है कि printf+ cat+ perlकॉम्बो perl -pe 's/\n//;END{printf "\n"}' input.txt एकल प्रक्रिया, कोई कमांड-प्रतिस्थापन और उद्धरण के साथ खिलवाड़, और कोई UUOC के माध्यम से बेहतर तरीके से नियंत्रित किया जाता है । शायद।
सर्गी कोलोडियाज़नी

7

आप के माध्यम से अपने बहुस्तरीय उत्पादन को पाइप कर सकते हैं awk

awk '{printf "%s",$0} END {print ""}'

या उपयोग sed:

sed ':a;N;$!ba;s/\n//g'

उदाहरण चलाते हैं

$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'              
1234

आगे पढ़ने: AWK · serverfault.SE का उपयोग करके लाइन ब्रेक को हटा दें



2

यदि आप इसके लिए पर्ल का उपयोग करना चाहते हैं, तो आप इसके chompकार्य का उपयोग कर सकते हैं :

perl -pe chomp

जो लोग रुचि रखते हैं, उनके लिए कुछ और विवरण।

आप बाद के तर्कों के रूप में एक या अधिक फ़ाइल नाम दे सकते हैं।

perl -pe chomp file1 file2 file3

कुछ मामलों में आप ऐसा नहीं करना चाहते हैं , लेकिन आप इसके बजाय उस कमांड को पाइप या रीडायरेक्ट कर सकते हैं। (ये क्षमताएँ - और वह चेतावनी - सभी किसी अन्य पर लागू होती हैं perl -pयाperl -n आधारित समाधान पर हैं।)

इसलिए, यदि आप रनिंग से आउटपुट प्रोसेस करना चाहते हैं some-command:

some-command | perl -pe chomp

यह टेर्डन के उत्तर में पर्ल कमांड की तुलना में संभावित तेज है । न्यूलाइन वर्ण (द्वारा दर्शाए गए \n) केवल इस स्थिति में लाइनों के अंत में दिखाई देते हैं - क्योंकि वे वही हैं जो पर्ल यह तय करने के लिए उपयोग कर रहा है कि प्रत्येक पंक्ति कहाँ समाप्त होती है। s/\n//नई लाइनों के लिए पूरी लाइन के माध्यम से खोज करता है, जबकि chompअंत में एक को हटाता है (यदि कोई हो, बहुत अंतिम पंक्ति के रूप में एक हो सकता है या नहीं हो सकता है)।

प्रदर्शन वास्तव में पसंद करने का मुख्य कारण नहीं हो सकता है chompperlमें आदेश terdon का जवाब केवल थोड़ा धीमी हो जब तक आप बहुत लंबी लाइनों के साथ एक बड़ी फ़ाइल संसाधित कर रहे हैं। और अगर आपको गति की आवश्यकता है, तो डेविड फ़ॉस्टर का रास्ता अभी भी संभवतः तेज है। chompहालाँकि, यदि आप पर्ल का उपयोग कर रहे हैं, तो इसके लिए बिल्कुल सही उपकरण है, और मुझे लगता है कि इसका इरादा इससे chompकहीं अधिक स्पष्ट हैs/\n// । अंततः बेहतर होने के लिए शायद कोई वस्तुनिष्ठ उत्तर नहीं है।

एक अंतिम newline मुद्रण।

हालाँकि, मैं कमांड प्रतिस्थापन ( $( )) के उपयोग के खिलाफ सिफारिश करता हूं ताकि यह सुनिश्चित किया जा सके कि एक अनुगामी न्यूलाइन प्रिंट हो जाए। जब तक आप जिस पाठ को संसाधित कर रहे हैं, वह छोटा है, तो यह काफी धीमा होने की संभावना है - इसे एक बार में सभी पाठ एकत्र करना होगा और फिर इसे प्रिंट करना होगा - और यह आपकी कमांड को समझने में कठिन बनाता है। इसके बजाय आप डेविड फ़ॉस्टर के रूप में सुझाए और चला सकते हैं echoया printf '\n'बाद में कर सकते हैं ।

perl -pe chomp; echo

आप कर रहे हैं पाइपिंग हैं से या (डेविड Foerster से पता चलता है के रूप में) पुन: निर्देशित से कि आदेश है, तो आप उस में संलग्न कर सकते हैं { ;}ताकि दोनों आदेशों के उत्पादन में एक साथ लिया जाता है। यदि आप इसे टर्मिनल पर प्रिंट कर रहे हैं, तो आप इसे ठीक उसी तरह चला सकते हैं जैसा कि ऊपर दिखाया गया है। यह अगर आपका पाइपिंग या पुनः निर्देशित भी काम करता है के लिए आदेश है, क्योंकि echo/ printf '\n'वास्तव में किसी भी इनपुट नहीं पढ़ता। अर्थात्, यह काम करता है:

some-command | perl -pe chomp; echo

जब आप यहाँ नहीं हटा सकते हैं { ;}:

{ perl -pe chomp; echo; } | some-other-command

या, यदि आप पसंद करते हैं, तो आप perlस्वयं ही अंतिम न्यूलाइन प्रिंट कर सकते हैं । संलग्न की तरह perlऔर echoमें आदेश { ;}, इस दृष्टिकोण से काम करता है यहां तक कि अगर आपका पाइपिंग या पुन: निर्देशित से यह (और, जैसे सभी दृष्टिकोण, जबकि आप पाइपिंग इस काम करता है के लिए यह भी):

perl -wpe 'chomp; END { print "\n" }'

ध्यान दें कि टेर्डन के उत्तर में कमांड अंतिम न्यूलाइन को प्रिंट करने के इन तरीकों के साथ ठीक काम करता है। उदाहरण के लिए:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'

perl -wpe 'chomp; END { print "\n" } एक ही प्रक्रिया है, अनुगामी प्रतिध्वनि जोड़ने पर मामूली लाभ
सर्जियो कोलोडिज्हनी


1

इस जवाब में उस समस्या का समाधान है जिसे आप बनाने की कोशिश कर रहे हैं: $ (कैट फ़ाइल) में bash remove \ n क्यों है?

यदि आप लिखते हैं cat myfile.txtतो आप देखेंगे:

abc
def
ghi

लेकिन अगर आप टाइप echo $(cat myfile.txt)करेंगे तो आप देखेंगे:

abc def ghi

ध्यान दें कि यह विधि एक ऐसी जगह को सम्मिलित करती है जहाँ अलग नई लाइनें हुआ करती थीं। यह आउटपुट को पढ़ना आसान बनाता है लेकिन आपके प्रश्न क्षेत्र का कड़ाई से पालन नहीं करता है।


0

यदि आप बैश का उपयोग कर रहे हैं, तो आप इसे किसी भी बाहरी उपकरण के बिना कर सकते हैं।

x=($(echo line1; echo line2))
echo "${x[@]}"

परिणाम:

line1 line2

पहला कमांड एक सरणी में मल्टीलाइन आउटपुट को चालू करता है, दूसरा कमांड एक लाइन में कई तर्कों में सरणी का विस्तार करता है।

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