बैश: आउटपुट से स्ट्रिप ट्रेलिंग लाइनब्रेक


187

जब मैं बैश (या विशिष्ट होने के लिए wc -l < log.txt) में कमांड निष्पादित करता हूं , तो आउटपुट में इसके बाद एक लाइनब्रेक होता है। मुझे इससे छुटकारा कैसे मिलेगा?

जवाबों:


249

यदि आपका अपेक्षित आउटपुट सिंगल लाइन है , तो आप आउटपुट से सभी न्यूलाइन वर्ण हटा सकते हैं। यह 'tr' उपयोगिता के लिए पाइप के लिए असामान्य नहीं होगा, या यदि पसंद किया जाए तो पर्ल:

wc -l < log.txt | tr -d '\n'

wc -l < log.txt | perl -pe 'chomp'

ट्रेलिंग न्यूलाइन को हटाने के लिए आप कमांड प्रतिस्थापन का भी उपयोग कर सकते हैं:

echo -n "$(wc -l < log.txt)"

printf "%s" "$(wc -l < log.txt)"

कृपया ध्यान दें कि मैं स्वीकृत उत्तर चुनने के ओपी के निर्णय से असहमत हूं। मेरा मानना ​​है कि किसी को जहां संभव हो, 'xargs' के इस्तेमाल से बचना चाहिए। हाँ, यह एक अच्छा खिलौना है। नहीं, आपको यहां इसकी आवश्यकता नहीं है।


यदि आपके अपेक्षित आउटपुट में कई लाइनें हो सकती हैं , तो आपके पास बनाने का एक और निर्णय है:

यदि आप फ़ाइल के अंत से MULTIPLE नईलाइन वर्ण हटाना चाहते हैं, तो फिर से cmd प्रतिस्थापन का उपयोग करें:

printf "%s" "$(< log.txt)"

यदि आप किसी फ़ाइल से LAST की नई पंक्ति वर्ण को सख्ती से हटाना चाहते हैं, तो पर्ल का उपयोग करें:

perl -pe 'chomp if eof' log.txt


ध्यान दें कि यदि आप निश्चित हैं कि आपके पास एक अनुगामी न्यूलाइन वर्ण है जिसे आप निकालना चाहते हैं, तो आप अंतिम बाइट को छोड़कर सब कुछ का चयन करने के लिए GNU कोरयूटिल्स से 'हेड' का उपयोग कर सकते हैं। यह बहुत जल्दी होना चाहिए:

head -c -1 log.txt

इसके अलावा, पूर्णता के लिए, आप 'कैट' और 'शो-ऑल' झंडे का उपयोग करके अपनी फ़ाइल में अपनी नई रेखा (या अन्य विशेष) वर्णों को जल्दी से देख सकते हैं। डॉलर संकेत चरित्र प्रत्येक पंक्ति के अंत का संकेत देगा:

cat -A log.txt

यह आउटपुट से सभी न्यूलाइन्स को स्ट्रिप्स करता है, न कि केवल शीर्षक के अनुसार अनुगामी न्यूलाइन।
कोडी ए। रे

@ CodyA.Ray: आपको इस बात से सहमत होना चाहिए, कि यह प्रश्न एक विशिष्ट कमांड का वर्णन करता है जो केवल कभी-कभी आउटपुट की एक पंक्ति का उत्पादन करेगा। हालाँकि, मैंने अपने उत्तर को और अधिक सामान्य मामले के अनुरूप अद्यतन किया है। HTH।
स्टीव

3
यह बेहतर होगा यदि छोटे विकल्पों को लंबे विकल्पों के साथ बदल दिया जाए। लंबे विकल्प के साथ-साथ फ़ंक्शन जैसे सिखाते हैं tr --delete '\n'
एलिजा लिन

1
मैंने भी किया| tr -d '\r'
AlikElzin-kilaka

यह ध्यान देने योग्य है कि यदि फ़ाइल बहुत बड़ी है, तो cmd प्रतिस्थापन समाधान एक लंबी लाइन का कारण बन सकता है।
फक

88

एक रास्ता:

wc -l < log.txt | xargs echo -n

24
बेहतर:echo -n `wc -l log.txt`
सत्या

9
पाइप का उपयोग करने की तुलना में बैकटिक्स में कमांड निष्पादन बेहतर क्यों है?
मैथ्यू Schinckel

2
ये न केवल अनुगामी न्यूलाइन्स को हटाएंगे, बल्कि एक स्थान पर किसी भी लगातार व्हाट्सएप (अधिक सटीक, जैसा कि परिभाषित किया गया है IFS) को भी निचोड़ेंगे। उदाहरण echo "a b" | xargs echo -n:; echo -n $(echo "a b")। यह उपयोग के मामले के लिए एक समस्या हो सकती है या नहीं भी हो सकती है।
मुशीफिल

14
इससे भी बदतर, अगर उत्पादन के साथ शुरू होता है -e, यह विकल्प के रूप में व्याख्या की जाएगी echo। यह हमेशा उपयोग करने के लिए सुरक्षित है printf '%s'
मुशीफिल

1
xargsमेरे सिस्टम पर बहुत धीमा है (और मुझे संदेह है कि यह अन्य प्रणालियों पर भी है), इसलिए printf '%s' $(wc -l log.txt)तेज हो सकता है, क्योंकि printfआमतौर पर एक बिलिन है (क्योंकि कोई जानकारी पुनर्निर्देशन नहीं है)। कभी बैकटिक्स का उपयोग न करें, उन्हें नए पॉसिक्स संस्करणों में पदावनत किया गया है और कई कमियां हैं।
yyny

13

बैश परिवर्तनशील प्रतिस्थापन में सफेद स्थान हटाने के लिए प्रत्यक्ष समर्थन भी है :

testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}

1
आप इसका उपयोग भी कर सकते हैंtrailing_linebreak_removed=${testvar%?}
PairedPrototype

ध्यान दें कि यदि आप कमांड प्रतिस्थापन का उपयोग कर रहे हैं, तो आपको नई रूपरेखाओं को हटाने के लिए कुछ भी करने की आवश्यकता नहीं है। बैश पहले से ही कमांड प्रतिस्थापन के भाग के रूप में करता है: gnu.org/software/bash/manual/html_node/…
माइकल बूर

10

यदि आप इसके आउटपुट को एक वैरिएबल पर असाइन करते हैं, तो bashस्वचालित रूप से व्हॉट्सएप स्ट्रिप्स:

linecount=`wc -l < log.txt`

10
अनुगामी न्यूलाइन्स छीन ली जाती हैं, सटीक होने के लिए। यह कमांड प्रतिस्थापन है जो उन्हें हटाता है, चर असाइनमेंट नहीं।
शेपनर

2
मैंने $ $ (cmd / c इको% VAR%) का उपयोग करते समय नहीं हटाए गए ट्रेलिंग व्हाट्सएप को Cygwin में देखा है। इस स्थिति में मुझे $ {var %% [[: space:]]} का उपयोग करना होगा।
एंड्री तारणोव

1
नोट: यह वैरिएबल असाइनमेंट नहीं है, लेकिन अभिव्यक्ति का विस्तार जो नईलाइन्स को निकालता है।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '

10

प्रिंटफ पहले से ही आपके लिए अनुगामी न्यूलाइन को क्रॉप करता है:

$ printf '%s' $(wc -l < log.txt)

विवरण:

  • के स्थान पर Printf आपकी सामग्री को प्रिंट करेगा %s स्ट्रिंग स्थान धारक के ।
  • यदि आप इसे एक नई लाइन ( %s\n) प्रिंट करने के लिए नहीं कहते हैं , तो यह नहीं होगा।

7
यदि आप कमांड के चारों ओर डबल कोट्स डालते हैं "$(command)", जैसे कि आंतरिक न्यूलाइन्स को संरक्षित किया जाएगा - और केवल अनुगामी न्यूलाइन को हटा दिया जाएगा। शेल यहां सभी काम कर रहा है - printfकमांड प्रतिस्थापन के परिणामों को वापस निर्देशित करने का एक तरीका है stdout
नोबार

2
यह प्रिंट नहीं है जो यहां नई लाइन को अलग कर रहा है, यह शेल है जो इसे $( )निर्माण के साथ कर रहा है । यहाँ सबूत है:printf "%s" "$(perl -e 'print "\n"')"
फ़्लिम

फिर, यह ध्यान देने योग्य है कि परिणामी कमांड लाइन बहुत लंबी हो सकती है।
फक

यह @ नोबार के सुझाव के साथ एक सुविधाजनक समाधान है:$ printf '%s' "$(wc -l < log.txt)"
इलियास करीम

8

यदि आप केवल अंतिम नई लाइन को हटाना चाहते हैं , तो इसके माध्यम से पाइप करें:

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+$//'

मुझे लगता है कि यह एक GNU एक्सटेंशन है, मैक sedप्रदान नहीं करता है -z
स्पाइडी

5

यदि आप बिना लाइन के अंत में बैश में किसी भी चीज़ का आउटपुट प्रिंट करना चाहते हैं, तो आप इसे -nस्विच से गूंजते हैं ।

यदि आपके पास यह पहले से ही एक चर में है, तो पीछे चल रही नई लाइन के साथ इसे प्रतिध्वनित करें :

    $ testvar=$(wc -l < log.txt)
    $ echo -n $testvar

या आप इसे एक पंक्ति में कर सकते हैं, बजाय:

    $ echo -n $(wc -l < log.txt)

2
चर तकनीकी रूप से अनावश्यक है। echo -n $(wc -l < log.txt)एक ही प्रभाव है।
शेपनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.