Come rilevare il file termina in una nuova riga?
-
09-06-2019 - |
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?
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.