Domanda

Alle Puoi modificare file di testo quando ti impegni in Subversion? Concessione mi ha suggerito di bloccare invece i commit.

Tuttavia non so come controllare che un file termini con una nuova riga.Come puoi rilevare che il file termina con una nuova riga?

È stato utile?

Soluzione

@Konrad:tail non restituisce una riga vuota.Ho creato un file che contiene del testo che non termina con una nuova riga e un file che lo fa.Ecco l'output di tail:

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

$ cat test_with_newline.txt
this file ends in newline
$

Anche se ho scoperto che tail ha l'opzione ottieni l'ultimo byte.Quindi ho modificato il tuo script in:

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

Altri suggerimenti

O ancora più semplice:

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

Ma se vuoi un controllo più approfondito:

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

Ecco un'utile funzione bash:

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

Puoi usarlo come:

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

Potresti usare qualcosa di simile come script di pre-commit:

#! /usr/bin/perl

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

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

Ha funzionato per me:

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

Quindi wc conta il numero di caratteri di nuova riga, il che è positivo nel nostro caso.Il oneliner stampa 0 o 1 in base alla presenza di una nuova riga alla fine del file.

Usando solo bash:

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

(Fai attenzione a copiare correttamente gli spazi bianchi!)

@grom:

tail non restituisce una riga vuota

Dannazione.Il mio file di test non è terminato \n ma su \n\n.Apparentemente vim non è possibile creare file che non terminano con \n (?).In ogni caso, finché l'opzione “ottieni ultimo byte” funziona, va tutto bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top