Como detectar arquivos que terminam em nova linha?
-
09-06-2019 - |
Pergunta
Às Você pode modificar arquivos de texto ao comprometer-se com o subversion? Conceder sugeri que eu bloqueasse os commits.
No entanto, não sei como verificar se um arquivo termina com uma nova linha.Como você pode detectar que o arquivo termina com uma nova linha?
Solução
@Konrad:tail não retorna uma linha vazia.Criei um arquivo que contém algum texto que não termina em nova linha e um arquivo que termina.Aqui está a saída da cauda:
$ cat test_no_newline.txt
this file doesn't end in newline$
$ cat test_with_newline.txt
this file ends in newline
$
Embora eu tenha descoberto que tail tem a opção de último byte.Então modifiquei seu script para:
#!/bin/sh
c=`tail -c 1 $1`
if [ "$c" != "" ]; then echo "no newline"; fi
Outras dicas
Ou ainda mais simples:
#!/bin/sh
test "$(tail -c 1 "$1")" && echo "no newline at eof: '$1'"
Mas se você quiser uma verificação mais robusta:
test "$(tail -c 1 "$1" | wc -l)" -eq 0 && echo "no newline at eof: '$1'"
Aqui está uma função bash útil:
function file_ends_with_newline() {
[[ $(tail -c1 "$1" | wc -l) -gt 0 ]]
}
Você pode usá-lo como:
if ! file_ends_with_newline myfile.txt
then
echo "" >> myfile.txt
fi
# continue with other stuff that assumes myfile.txt ends with a newline
Você poderia usar algo assim como seu script de pré-commit:
#! /usr/bin/perl while (<>) { $last = $_; } if (! ($last =~ m/\n$/)) { print STDERR "File doesn't end with \\n!\n"; exit 1; }
Funcionou para mim:
tail -n 1 /path/to/newline_at_end.txt | wc --lines
# according to "man wc" : --lines - print the newline counts
Então wc conta o número de caracteres de nova linha, o que é bom no nosso caso.O oneliner imprime 0 ou 1 de acordo com a presença de nova linha no final do arquivo.
Usando apenas bash
:
x=`tail -n 1 your_textfile`
if [ "$x" == "" ]; then echo "empty line"; fi
(Tenha cuidado para copiar os espaços em branco corretamente!)
@grom:
tail não retorna uma linha vazia
Droga.Meu arquivo de teste não terminou em \n
mas em \n\n
.Aparentemente vim
não é possível criar arquivos que não terminem em \n
(?).De qualquer forma, desde que a opção “obter último byte” funcione, está tudo bem.