मैं फ़ाइल के अंत में newline वर्ण कैसे निकालूं?


35

मुझे नए वर्ण के बारे में स्पष्ट करने दें:

$ echo Hello > file1 ; cat file1
Hello
$ echo -n  Hello > file2 ; cat file2
Hello$ 

यहाँ आप देख सकते हैं कि file1अंत में newline वर्ण है जबकि file2नहीं है।

अब मान लीजिए कि मैंने एक file:

$ cat file
Hello
Welcome to
Unix
$

और मैं and Linuxफ़ाइल के अंत में जोड़ना चाहता हूं , फिर echo " and Linux" >> fileन्यूलाइन में जोड़ा जाएगा। लेकिन मैं अंतिम पंक्ति चाहता हूंUnix and Linux

इसलिए, मैं आसपास काम करने के लिए फ़ाइल के अंत में newline वर्ण निकालना चाहता हूं। इसलिए मैं फ़ाइल के अंत में newline वर्ण कैसे निकालूं?


6
इसे न निकालें, बस एक टेक्स्ट एडिटर का उपयोग करें। sed '$s/$/ and linux/'
123

जवाबों:


29

यदि आप सभी करना चाहते हैं, तो अंतिम पंक्ति में पाठ जोड़ना है, यह sed के साथ बहुत आसान है। बदलें $(पैटर्न जो पंक्ति के अंत में मेल खाता है) जिसे आप जोड़ना चाहते हैं, केवल सीमा में लाइनों पर $(जिसका अर्थ है अंतिम पंक्ति)।

sed '$ s/$/ and Linux/' <file >file.new &&
mv file.new file

जिसे लिनक्स पर छोटा किया जा सकता है

sed -i '$ s/$/ and Linux/' file

यदि आप किसी फ़ाइल में अंतिम बाइट को निकालना चाहते हैं, तो लिनक्स (अधिक सटीक रूप से जीएनयू कोर्यूटिल्स) truncateकमांड प्रदान करता है , जिससे यह बहुत आसान हो जाता है।

truncate -s -1 file

ऐसा करने का एक POSIX तरीका है dd। पहले फ़ाइल की लंबाई निर्धारित करें, फिर इसे एक बाइट कम पर काटें।

length=$(wc -c <file)
dd if=/dev/null of=file obs="$((length-1))" seek=1

ध्यान दें कि ये दोनों बिना शर्त फ़ाइल के अंतिम बाइट को काटते हैं। आप जाँच सकते हैं कि यह पहली बार एक नई पंक्ति है:

length=$(wc -c <file)
if [ "$length" -ne 0 ] && [ -z "$(tail -c -1 <file)" ]; then
  # The file ends with a newline or null
  dd if=/dev/null of=file obs="$((length-1))" seek=1
fi

9
एक अनुगामी न्यूलाइन को हटाने का बेहतर तरीका है perl -pi -e 'chomp if eof' myfile। की तुलना में truncateया ddयह एक टूटी हुई फ़ाइल के साथ आपको छोड़ने वाला नहीं है अगर myfileवास्तव में कोई नई अनुगामी नहीं थी।
हाय-एंजेल

2
@ हाय-एंजेल मैं एक सलाह के रूप में लिखने की सलाह दे सकता हूं? मुझे लगता है कि यह बहुत अच्छा जवाब होगा।
साइमन फोर्सबर्ग

@SimonForsberg धन्यवाद, किया गया
हाय-एंजेल

17

हालाँकि, आप लाइन से न्यूलाइन वर्ण को हटा सकते हैं tr -d '\n':

$ echo -e "Hello"
Hello
$ echo -e "Hello" | tr -d '\n'
Hello$

आप निम्न आसान तरीके का उपयोग करके फ़ाइल के अंत में नई पंक्ति वर्ण को निकाल सकते हैं:

  1. head -c -1 file

    से man head:

    -c, --bytes=[-]K
              print the first K bytes of each file; with the leading '-',
              print all but the last K bytes of each file
    
  2. truncate -s -1 file

    से man truncate:

    -s, --size=SIZE
              set or adjust the file size by SIZE
    

    SIZE is an integer and optional unit (example: 10M is 10*1024*1024).
    Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).
    
    SIZE  may  also be prefixed by one of the following modifying characters: 
    '+' extend by, '-' reduce by, '<' at most, '>' at least, '/' round down to multiple of, '%' round up to multiple of.
    

है head -c -1 file | tee fileसुरक्षित? teeप्रारंभ करने से पहले फ़ाइल को छोटा नहीं किया जाएगा?
इरूवर

1
@ 1_CR वास्तव में। पाइप के दो पक्ष समानांतर में शुरू होते हैं, यह बात है कि कौन रेस जीतता है। चूँकि teeकेवल फ़ाइल को खोलना है, जबकि headइसकी सामग्री को पढ़ना और लिखना है, teeअभ्यास में दौड़ को कभी-कभी बहुत छोटी फ़ाइलों को छोड़कर जीत सकते हैं।
गाइल्स 'एसओ- बुराई को रोकना'

2
यह अंतिम न्यूलाइन को नहीं हटाता है, यह सभी न्यूलाइन को हटा देता है। IMO काफी बड़ा अंतर है।
हाय-एंजेल

10

आप इसे प्रति के रूप में प्राप्त कर सकते हैं:

perl -pi -e 'chomp if eof' myfile

की तुलना में truncateया ddयह एक टूटी हुई फ़ाइल के साथ आपको छोड़ने वाला नहीं है यदि myfileवास्तव में कोई अनुगामी newlines नहीं था।

(उत्तर टिप्पणी से निर्मित है , और इस उत्तर पर आधारित है )


धन्यवाद! हटाने की यह सशर्त विधि नई रेखा को पीछे छोड़ रही है।
xer0x

3

यहाँ एक तरीका है sed- $फ़ाइल के अंतिम ( ) लाइन पर, कुछ भी और सब कुछ खोजें (और .*") जो आपने" और लिनक्स "और उसके बाद" जो कुछ भी मिलान किया "के साथ प्रतिस्थापित करें :

sed '$s/\(.*\)/\1 and Linux/' file

इसहाक के सौजन्य से एक और भी सरल उपाय है:

sed '$s/$/ and Linux/' file

यह दिए गए पाठ के साथ (प्रतीकात्मक) एंड-ऑफ-लाइन की जगह लेता है।


इसहाक, मुझे वह सुझाव पसंद है! यह सरल / अधिक स्पष्ट है। मैं इसके साथ उत्तर को अपडेट करूंगा। धन्यवाद!
जेफ स्कालर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.