perl -pe 'chomp if eof' filename >filename2
oppure, per modificare il file sul posto:
perl -pi -e 'chomp if eof' filename
Questo è stato descritto come una "blasfemia perl" sul sito web di awk che ho visto.
Ma, in un test, ha funzionato.
Puoi sfruttare il fatto che le sostituzioni dei comandi shell rimuovono i caratteri di fine riga finali :
Forma semplice che funziona in bash, ksh, zsh:
printf %s "$(< in.txt)" > out.txt
Alternativa portatile (conforme a POSIX) (leggermente meno efficiente):
printf %s "$(cat in.txt)" > out.txt
Nota:
- Se
in.txt
termina con multiplo caratteri di nuova riga, la sostituzione del comando rimuove tutto di loro . (Non rimuove gli spazi bianchi diversi dai newline finali.) - Poiché questo approccio legge l'intero file di input in memoria , è consigliabile solo per file più piccoli.
printf %s
assicura che nessuna nuova riga venga aggiunta all'output (è l'alternativa conforme a POSIX al non standardecho -n
; vedi http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html e https://unix.stackexchange.com/a/65819)
Una guida alle altre risposte :
-
Se Perl è disponibile, scegli la risposta accettata:è semplice ed efficiente in termini di memoria (non legge l'intero file di input in una volta).
-
Altrimenti, considera Awk di ghostdog74 risposta:è oscuro, ma anche efficiente in termini di memoria; un equivalente più leggibile (conforme a POSIX) è:
-
awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt
-
La stampa è ritardata di una riga in modo che l'ultima riga possa essere gestita nel
END
blocco, dove viene stampato senza un\n
finale a causa dell'impostazione del separatore di output-record (OFS
) in una stringa vuota. -
Se vuoi una soluzione prolissa, ma veloce e affidabile che modifichi veramente sul posto (invece di creare un file temporaneo che poi sostituisca l'originale), considera lo script Perl di jrockway .