GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso eliminare una nuova riga se è l'ultimo carattere in un file?

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 standard echo -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 .


Linux
  1. Come posso collegare simbolicamente un file in Linux?

  2. usando Linux come posso passare il contenuto di un file come parametro a un eseguibile?

  3. Come usare sed per rimuovere le ultime n righe di un file

  4. Come salvare l'output di questo comando awk su file?

  5. Come posso elencare (ls) gli ultimi 5 file modificati in una directory?

Come posso correggere i permessi dei miei file?

come posso differenziare due sezioni dello stesso file?

Come si esegue il gunzip di un file e si conserva il file .gz?

Come posso assicurarmi che il mio sistema utilizzi il file ~/.screenrc?

Come posso ottenere la lunghezza di un file video dalla console?

Come posso trovare il file più vecchio in un albero di directory