GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo eliminar una nueva línea si es el último carácter de un archivo?

perl -pe 'chomp if eof' filename >filename2

o, para editar el archivo en su lugar:

perl -pi -e 'chomp if eof' filename

Esto fue descrito como una 'blasfemia perl' en el sitio web de awk que vi.

Pero, en una prueba, funcionó.


Puede aprovechar el hecho de que las sustituciones de comandos de shell eliminan los caracteres finales de nueva línea :

Forma simple que funciona en bash, ksh, zsh:

printf %s "$(< in.txt)" > out.txt

Alternativa portátil (compatible con POSIX) (ligeramente menos eficiente):

printf %s "$(cat in.txt)" > out.txt

Nota:

  • Si in.txt termina con múltiple caracteres de nueva línea, la sustitución del comando elimina todos de ellos . (No elimina los caracteres de espacio en blanco que no sean las líneas nuevas finales).
  • Dado que este enfoque lee todo el archivo de entrada en la memoria , solo es recomendable para archivos más pequeños.
  • printf %s asegura que no se agregue una línea nueva a la salida (es la alternativa compatible con POSIX al echo -n no estándar; consulte http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html y https://unix.stackexchange.com/a/65819)

Una guía para las otras respuestas :

  • Si Perl está disponible, busque la respuesta aceptada:es simple y eficiente en memoria (no lee todo el archivo de entrada a la vez).

  • De lo contrario, considera Awk de ghostdog74 respuesta - es oscura, pero también eficiente en memoria; un equivalente más legible (compatible con POSIX) es:

  • awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt

  • La impresión se retrasa una línea para que la línea final pueda manejarse en el END bloque, donde se imprime sin un final \n debido a la configuración del separador de registro de salida (OFS ) a una cadena vacía.

  • Si desea una solución detallada, pero rápida y robusta que realmente edite en el lugar (en lugar de crear un archivo temporal que luego reemplace el original), considere el script Perl de jrockway .


Linux
  1. ¿Cómo puedo recordar el argumento del comando bash anterior?

  2. Comando tr:cómo reemplazar la cadena \n con una nueva línea real (\n)

  3. ¿Cómo puedo anteponer una cadena al comienzo de cada línea en un archivo?

  4. ¿Cómo puedes ver el enlace duro real por ls?

  5. ¿Cómo puedo agregar un usuario normal al archivo sudoers?

¿Cómo agregar una nueva línea al final de un archivo?

¿Cómo puedo arreglar los permisos de mis archivos?

¿Cómo puedo diferenciar dos secciones del mismo archivo?

¿Cómo puedo enumerar (ls) los 5 últimos archivos modificados en un directorio?

¿Cómo puedo asegurarme de que mi sistema use el archivo ~/.screenrc?

¿Cómo puedo obtener la duración de un archivo de video desde la consola?