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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top