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.txt
se 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 %s
garantit qu'aucune nouvelle ligne n'est ajoutée à la sortie (c'est l'alternative conforme à POSIX auecho -n
non 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
END
bloc, 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 .