¿Cómo detectar archivos que terminan en nueva línea?
-
09-06-2019 - |
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?
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.