perl -pe 'chomp if eof' filename >filename2
ou, pour éditer le fichier en place :
perl -pi -e 'chomp if eof' filename
Cela a été décrit comme un 'blasphème perl' sur le site Web awk que j'ai vu.
Mais, lors d'un test, cela a fonctionné.
Vous pouvez profiter du fait que les substitutions de commandes shell suppriment les caractères de fin de ligne :
Forme simple qui fonctionne en bash, ksh, zsh :
printf %s "$(< in.txt)" > out.txt
Alternative portable (conforme à POSIX) (légèrement moins efficace) :
printf %s "$(cat in.txt)" > out.txt
Remarque :
- Si
in.txtse termine par multiple caractères de saut de ligne, la substitution de commande supprime tous d'eux . (Il ne supprime pas les caractères d'espacement autres que les retours à la ligne de fin.) - Étant donné que cette approche lit l'intégralité du fichier d'entrée en mémoire , il n'est conseillé que pour les petits fichiers.
printf %sgarantit qu'aucune nouvelle ligne n'est ajoutée à la sortie (c'est l'alternative conforme à POSIX auecho -nnon standard; voir http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html et https://unix.stackexchange.com/a/65819)
Un guide des autres réponses :
-
Si Perl est disponible, optez pour la réponse acceptée - c'est simple et économe en mémoire (ne lit pas tout le fichier d'entrée à la fois).
-
Sinon, pensez à Awk de ghostdog74 réponse - c'est obscur, mais aussi économe en mémoire; un équivalent plus lisible (conforme à POSIX) est :
-
awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt -
L'impression est retardée d'une ligne afin que la dernière ligne puisse être traitée dans le
ENDbloc, où il est imprimé sans\nà la fin en raison de la définition du séparateur d'enregistrement de sortie (OFS) en une chaîne vide. -
Si vous voulez une solution verbeuse, mais rapide et robuste qui modifie vraiment sur place (par opposition à la création d'un fichier temporaire qui remplace ensuite l'original), considérez le script Perl de jrockway .