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 alecho -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 .