2008-09-02 13 views
10

Can you modify text files when committing to subversion?Grant पर सुझाव दिया गया कि मैं इसके बजाय काम करता हूं।नई लाइन में फ़ाइल समाप्त होने का पता कैसे लगाया जाए?

हालांकि मुझे नहीं पता कि फ़ाइल को एक नई लाइन के साथ कैसे समाप्त किया जाए। आप कैसे पता लगा सकते हैं कि फ़ाइल एक नई लाइन के साथ समाप्त होती है?

उत्तर

11

@Konrad: पूंछ एक खाली रेखा वापस नहीं करता है। मैंने एक फाइल बनाई जिसमें कुछ पाठ है जो नई लाइन में समाप्त नहीं होता है और एक फ़ाइल जो करता है। पूंछ से आउटपुट यहां दिया गया है:

$ cat test_no_newline.txt 
this file doesn't end in newline$ 

$ cat test_with_newline.txt 
this file ends in newline 
$ 

हालांकि मुझे पता चला कि पूंछ को अंतिम बाइट विकल्प मिल गया है। तो मैं करने के लिए अपनी स्क्रिप्ट संशोधित:

#!/bin/sh 
c=`tail -c 1 $1` 
if [ "$c" != "" ]; then echo "no newline"; fi 
+3

+1 सरल, प्रभावी, पोर्टेबल। और पर्ल नहीं। :) –

+1

यह उत्तर इष्टतम नहीं है क्योंकि मेरे पास कोई संकेत नहीं है कि आप कोनराड का जिक्र कर रहे हैं। – oberlies

+1

मेरे लिए काम नहीं करता है। – Black

-2

आपको इसे एसवीएन प्री-प्रतिबद्ध हुक के माध्यम से करने में सक्षम होना चाहिए।

this example देखें।

+1

यह वास्तविक सवाल है, जो समाधान नहीं करता है "आप कैसे पता लगा सकते हैं कि फ़ाइल समाप्त होता है एक नई लाइन के साथ? " –

3

आपकी पूर्व-प्रतिबद्ध स्क्रिप्ट के रूप में कुछ इस तरह इस्तेमाल कर सकते हैं:

 
#! /usr/bin/perl 

while (<>) { 
    $last = $_; 
} 

if (! ($last =~ m/\n$/)) { 
    print STDERR "File doesn't end with \\n!\n"; 
    exit 1; 
} 
1

का उपयोग केवल bash:

x=`tail -n 1 your_textfile` 
if [ "$x" == "" ]; then echo "empty line"; fi 

(! सही ढंग से व्हाइटस्पेस कॉपी करने के लिए ध्यान रखना)

@ ग्राम:

पूंछ एक खाली रेखा

डॉन वापस नहीं करता है। मेरी टेस्ट फ़ाइल \n पर समाप्त नहीं हुई लेकिन \n\n पर समाप्त नहीं हुई। स्पष्ट रूप से vim उन फ़ाइलों को नहीं बना सकता है जो \n (?) पर समाप्त नहीं होते हैं। वैसे भी, जब तक "अंतिम बाइट प्राप्त करें" विकल्प काम करता है, सब ठीक है।

10

या और भी आसान:

#!/bin/sh 
test "$(tail -c 1 "$1")" && echo "no newline at eof: '$1'" 

लेकिन आप एक और अधिक मजबूत की जांच चाहते हैं:

test "$(tail -c 1 "$1" | wc -l)" -eq 0 && echo "no newline at eof: '$1'" 
+0

भरोसेमंद नहीं है, क्योंकि यह ईओएल और किसी अन्य अंतरिक्ष चरित्र के बीच अंतर नहीं बता सकता है। – akim

+0

@akim यह अब तय है। – FelipeC

+0

यह अभी भी विफल रहता है उदा। यदि अंतिम चरित्र एक शून्य बाइट है। – tripleee

3

मेरे लिए काम किया:

tail -n 1 /path/to/newline_at_end.txt | wc --lines 
# according to "man wc" : --lines - print the newline counts 

तो wc न्यूलाइन ch की संख्या की गणना करता है ars, जो हमारे मामले में अच्छा है। ऑनलाइनर फ़ाइल के अंत में नई लाइन की उपस्थिति के अनुसार या तो 0 या 1 प्रिंट करता है।

function file_ends_with_newline() { 
    [[ $(tail -c1 "$1" | wc -l) -gt 0 ]] 
} 

आप इसे पसंद उपयोग कर सकते हैं:

4

यहाँ एक उपयोगी बैश समारोह है

if ! file_ends_with_newline myfile.txt 
then 
    echo "" >> myfile.txt 
fi 
# continue with other stuff that assumes myfile.txt ends with a newline 
+1

यह स्वीकार्य उत्तर होना चाहिए; यह खाली फ़ाइलों के लिए सही ढंग से काम करता है, एक नल बाइट में समाप्त फाइलें, और नियमित फाइलें। 'Wc -l' पर पाइप अवांछित है लेकिन यह बिल्कुल सही चीज करता है - यह फ़ाइल के अंतिम बाइट में न्यूलाइन की संख्या की गणना करता है। यदि यह एक नहीं है, तो फ़ाइल एक नई लाइन के साथ समाप्त नहीं होती है। – tripleee