क्या एक ही लाइन पर मल्टी-लाइन आउटपुट (सिंगल आउटपुट) प्रिंट करने की विधि है?
उदाहरण के लिए, यदि आउटपुट है:
abc
def
qwerty
क्या यह प्रिंट करना संभव है:
abcdefqwerty
क्या एक ही लाइन पर मल्टी-लाइन आउटपुट (सिंगल आउटपुट) प्रिंट करने की विधि है?
उदाहरण के लिए, यदि आउटपुट है:
abc
def
qwerty
क्या यह प्रिंट करना संभव है:
abcdefqwerty
जवाबों:
आप दिए गए सेट से वर्णों की सभी घटनाओं को हटा सकते हैं tr -d
। Newline वर्ण उपयोग को हटाने के लिए:
tr -d '\n'
हमेशा की तरह आप इनपुट और आउटपुट रीडायरेक्शन और पाइप का उपयोग फ़ाइलों और अन्य प्रक्रियाओं से पढ़ने या लिखने के लिए कर सकते हैं।
आप पिछले न्यू लाइन रखना चाहते हैं तो आप बस इसके साथ वापस जोड़ सकते हैं echo
या printf '\n'
, जैसे:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
कई तरीकों से। वर्णन करने के लिए, मैंने आपका उदाहरण इसमें सहेजा है 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
आप के माध्यम से अपने बहुस्तरीय उत्पादन को पाइप कर सकते हैं 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 का उपयोग करके लाइन ब्रेक को हटा दें
इसके अलावा your_command | paste -sd ''
जो अनुगामी न्यूलाइन को संरक्षित करता है।
यदि आप इसके लिए पर्ल का उपयोग करना चाहते हैं, तो आप इसके 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
अंत में एक को हटाता है (यदि कोई हो, बहुत अंतिम पंक्ति के रूप में एक हो सकता है या नहीं हो सकता है)।
प्रदर्शन वास्तव में पसंद करने का मुख्य कारण नहीं हो सकता है chomp
। perl
में आदेश terdon का जवाब केवल थोड़ा धीमी हो जब तक आप बहुत लंबी लाइनों के साथ एक बड़ी फ़ाइल संसाधित कर रहे हैं। और अगर आपको गति की आवश्यकता है, तो डेविड फ़ॉस्टर का रास्ता अभी भी संभवतः तेज है। chomp
हालाँकि, यदि आप पर्ल का उपयोग कर रहे हैं, तो इसके लिए बिल्कुल सही उपकरण है, और मुझे लगता है कि इसका इरादा इससे chomp
कहीं अधिक स्पष्ट हैs/\n//
। अंततः बेहतर होने के लिए शायद कोई वस्तुनिष्ठ उत्तर नहीं है।
हालाँकि, मैं कमांड प्रतिस्थापन ( $(
)
) के उपयोग के खिलाफ सिफारिश करता हूं ताकि यह सुनिश्चित किया जा सके कि एक अनुगामी न्यूलाइन प्रिंट हो जाए। जब तक आप जिस पाठ को संसाधित कर रहे हैं, वह छोटा है, तो यह काफी धीमा होने की संभावना है - इसे एक बार में सभी पाठ एकत्र करना होगा और फिर इसे प्रिंट करना होगा - और यह आपकी कमांड को समझने में कठिन बनाता है। इसके बजाय आप डेविड फ़ॉस्टर के रूप में सुझाए और चला सकते हैं 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" }
एक ही प्रक्रिया है, अनुगामी प्रतिध्वनि जोड़ने पर मामूली लाभ
केवल-शेल तरीके का उपयोग करना:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
इस जवाब में उस समस्या का समाधान है जिसे आप बनाने की कोशिश कर रहे हैं: $ (कैट फ़ाइल) में bash remove \ n क्यों है?
यदि आप लिखते हैं cat myfile.txt
तो आप देखेंगे:
abc
def
ghi
लेकिन अगर आप टाइप echo $(cat myfile.txt)
करेंगे तो आप देखेंगे:
abc def ghi
ध्यान दें कि यह विधि एक ऐसी जगह को सम्मिलित करती है जहाँ अलग नई लाइनें हुआ करती थीं। यह आउटपुट को पढ़ना आसान बनाता है लेकिन आपके प्रश्न क्षेत्र का कड़ाई से पालन नहीं करता है।
printf
+cat
+perl
कॉम्बोperl -pe 's/\n//;END{printf "\n"}' input.txt
एकल प्रक्रिया, कोई कमांड-प्रतिस्थापन और उद्धरण के साथ खिलवाड़, और कोई UUOC के माध्यम से बेहतर तरीके से नियंत्रित किया जाता है । शायद।