2008-09-02 10 views

Respuesta

11

@Konrad: tail no devuelve una línea vacía. Hice un archivo que tiene un texto que no termina en nueva línea y un archivo que sí lo hace. Aquí está la salida de la cola:

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

$ cat test_with_newline.txt 
this file ends in newline 
$ 

Aunque encontré que la cola tiene la opción de último byte. Así que he modificado la secuencia de comandos a:

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

+1 Simple, efectivo, portátil. Y no perl. :) –

+1

Esta respuesta no es óptima porque no tengo idea de a qué Konrad te refieres. – oberlies

+1

No funciona para mí. – Black

-2

Debería poder hacerlo a través de un gancho de precompilación de SVN.

Ver this example.

+1

Esto no aborda la cuestión real, que es "¿Cómo se puede detectar que los extremos de archivos con una nueva línea? " –

3

Usted podría utilizar algo así como su pre-commit script:

 
#! /usr/bin/perl 

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

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

Usando sólo bash:

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

(! Tenga cuidado para copiar los espacios en blanco correctamente)

@ grom:

tail no devuelve una línea vacía

Damn. Mi archivo de prueba no finalizó en \n, pero en \n\n. Aparentemente vim no puede crear archivos que no terminan en \n (?). De todos modos, siempre y cuando la opción "obtener el último byte" funcione, todo está bien.

10

O aún más simple:

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

Pero si quieres un cheque más robusto:

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

No es confiable, ya que no puede distinguir entre EOL y cualquier otro carácter espacial. – akim

+0

@akim Ahora está arreglado. – FelipeC

+0

Esto aún falla, p. si el último carácter es un byte nulo. – tripleee

3

trabajado para mí:

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 canales nuevos ars, que es bueno en nuestro caso. El delineador de impresión imprime 0 o 1 según la presencia de nueva línea al final del archivo.

4

Aquí es una función útil fiesta:

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

Usted puede 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 
+1

Esta debería ser la respuesta aceptada; funciona correctamente para archivos vacíos, archivos que terminan en un byte nulo y archivos regulares. El conducto para 'wc -l' es poco atractivo pero hace exactamente lo correcto: cuenta el número de nuevas líneas en el último byte del archivo. Si no es uno, el archivo no termina con una nueva línea. – tripleee

Cuestiones relacionadas