Pregunta

Sobre ¿Puedes modificar archivos de texto al comprometerte con Subversion? Conceder sugirió que bloqueara las confirmaciones en su lugar.

Sin embargo, no sé cómo comprobar que un archivo termina con una nueva línea.¿Cómo puedes detectar que el archivo termina con una nueva línea?

¿Fue útil?

Solución

@Konrad:tail no devuelve una línea vacía.Creé un archivo que tiene texto que no termina en nueva línea y un archivo que sí lo hace.Aquí está el resultado de tail:

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

$ cat test_with_newline.txt
this file ends in newline
$

Aunque descubrí que tail tiene la opción de obtener el último byte.Entonces modifiqué tu script para:

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

Otros consejos

O incluso más simple:

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

Pero si desea un control más sólido:

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

Aquí hay una función bash útil:

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

Puedes usarlo 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

Podrías usar algo como esto como script previo a la confirmación:

#! /usr/bin/perl

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

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

Trabajó para mi:

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

Entonces wc cuenta el número de caracteres de nueva línea, lo cual es bueno en nuestro caso.El oneliner imprime 0 o 1 según la presencia de una nueva línea al final del archivo.

Usando solo bash:

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

(¡Tenga cuidado de copiar los espacios en blanco correctamente!)

@grom:

tail no devuelve una línea vacía

Maldición.Mi archivo de prueba no terminó el \n pero en \n\n.Aparentemente vim No se pueden crear archivos que no terminen en \n (?).De todos modos, mientras funcione la opción "obtener el último byte", todo estará bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top