जब मैं बैश (या विशिष्ट होने के लिए wc -l < log.txt
) में कमांड निष्पादित करता हूं , तो आउटपुट में इसके बाद एक लाइनब्रेक होता है। मुझे इससे छुटकारा कैसे मिलेगा?
जब मैं बैश (या विशिष्ट होने के लिए wc -l < log.txt
) में कमांड निष्पादित करता हूं , तो आउटपुट में इसके बाद एक लाइनब्रेक होता है। मुझे इससे छुटकारा कैसे मिलेगा?
जवाबों:
यदि आपका अपेक्षित आउटपुट सिंगल लाइन है , तो आप आउटपुट से सभी न्यूलाइन वर्ण हटा सकते हैं। यह '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
tr --delete '\n'
।
| tr -d '\r'
एक रास्ता:
wc -l < log.txt | xargs echo -n
echo -n `wc -l log.txt`
IFS
) को भी निचोड़ेंगे। उदाहरण echo "a b" | xargs echo -n
:; echo -n $(echo "a b")
। यह उपयोग के मामले के लिए एक समस्या हो सकती है या नहीं भी हो सकती है।
-e
, यह विकल्प के रूप में व्याख्या की जाएगी echo
। यह हमेशा उपयोग करने के लिए सुरक्षित है printf '%s'
।
xargs
मेरे सिस्टम पर बहुत धीमा है (और मुझे संदेह है कि यह अन्य प्रणालियों पर भी है), इसलिए printf '%s' $(wc -l log.txt)
तेज हो सकता है, क्योंकि printf
आमतौर पर एक बिलिन है (क्योंकि कोई जानकारी पुनर्निर्देशन नहीं है)। कभी बैकटिक्स का उपयोग न करें, उन्हें नए पॉसिक्स संस्करणों में पदावनत किया गया है और कई कमियां हैं।
बैश परिवर्तनशील प्रतिस्थापन में सफेद स्थान हटाने के लिए प्रत्यक्ष समर्थन भी है :
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
trailing_linebreak_removed=${testvar%?}
यदि आप इसके आउटपुट को एक वैरिएबल पर असाइन करते हैं, तो bash
स्वचालित रूप से व्हॉट्सएप स्ट्रिप्स:
linecount=`wc -l < log.txt`
प्रिंटफ पहले से ही आपके लिए अनुगामी न्यूलाइन को क्रॉप करता है:
$ printf '%s' $(wc -l < log.txt)
विवरण:
%s
स्ट्रिंग स्थान धारक के । %s\n
) प्रिंट करने के लिए नहीं कहते हैं , तो यह नहीं होगा।"$(command)"
, जैसे कि आंतरिक न्यूलाइन्स को संरक्षित किया जाएगा - और केवल अनुगामी न्यूलाइन को हटा दिया जाएगा। शेल यहां सभी काम कर रहा है - printf
कमांड प्रतिस्थापन के परिणामों को वापस निर्देशित करने का एक तरीका है stdout
।
$( )
निर्माण के साथ कर रहा है । यहाँ सबूत है:printf "%s" "$(perl -e 'print "\n"')"
$ printf '%s' "$(wc -l < log.txt)"
यदि आप केवल अंतिम नई लाइन को हटाना चाहते हैं , तो इसके माध्यम से पाइप करें:
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+$//'
sed
प्रदान नहीं करता है -z
।
यदि आप बिना लाइन के अंत में बैश में किसी भी चीज़ का आउटपुट प्रिंट करना चाहते हैं, तो आप इसे -n
स्विच से गूंजते हैं ।
यदि आपके पास यह पहले से ही एक चर में है, तो पीछे चल रही नई लाइन के साथ इसे प्रतिध्वनित करें :
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
या आप इसे एक पंक्ति में कर सकते हैं, बजाय:
$ echo -n $(wc -l < log.txt)
echo -n $(wc -l < log.txt)
एक ही प्रभाव है।