2008-09-02 7 views

Antwort

11

@Konrad: Das Ende gibt keine Leerzeile zurück. Ich habe eine Datei erstellt, die Text enthält, der nicht in Newline endet, und eine Datei, die das tut. Hier ist die Ausgabe von tail:

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

$ cat test_with_newline.txt 
this file ends in newline 
$ 

Obwohl ich festgestellt, dass Schwanz letzte Byte Option erhalten. So modifizierte ich das Skript auf:

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

+1 Einfach, effektiv, tragbar. Und nicht Perl. :) –

+1

Diese Antwort ist nicht optimal, da ich keine Ahnung habe, auf welchen Konrad du dich beziehst. – oberlies

+1

Funktioniert nicht für mich. – Black

-2

Sie sollten es über einen SVN Pre-Commit Hook tun können.

Siehe this example.

+1

Diese die eigentliche Frage ist nicht ein, das „Wie kann man erkennen ist, dass die Datei Ende mit einer Newline? " –

3

Sie so etwas wie dies als pre-commit-Skript verwenden:

 
#! /usr/bin/perl 

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

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

Mit nur bash:

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

(! Achten Sie darauf, kopieren Sie die Whitespaces korrekt)

@ grom:

Ende gibt keine Leerzeile zurück

Verdammt. Meine Testdatei endete nicht auf \n sondern auf \n\n. Anscheinend kann vim Dateien nicht erstellen, die nicht auf \n (?) Enden. Wie auch immer, solange die Option "get last byte" funktioniert, ist alles in Ordnung.

10

Oder noch einfacher:

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

Aber wenn Sie eine robustere Kontrolle:

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

Nicht vertrauenswürdig, da es den Unterschied zwischen EOL und anderen Leerzeichen nicht erkennen kann. – akim

+0

@akim Es ist jetzt behoben. – FelipeC

+0

Dies schlägt z. wenn das letzte Zeichen ein Null-Byte ist. – tripleee

3

für mich gearbeitet:

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

Also WC zählt Anzahl der Newline ch ars, was in unserem Fall gut ist. Der oneliner druckt entweder 0 oder 1 je nach Vorhandensein von Zeilenumbruch am Ende der Datei.

4

Hier ist eine nützliche Funktion bash:

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

Sie können es gerne verwenden:

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

Dies sollte die akzeptierte Antwort sein; Es funktioniert ordnungsgemäß für leere Dateien, Dateien, die in einem Nullbyte enden, und reguläre Dateien. Die Pipe zu 'wc -l' ist irgendwie unattraktiv, aber sie tut genau das Richtige - sie zählt die Anzahl der Zeilenumbrüche im letzten Byte der Datei. Wenn es nicht eins ist, endet die Datei nicht mit einem Zeilenumbruch. – tripleee