GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je supprimer une nouvelle ligne si c'est le dernier caractère d'un fichier ?

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


Linux
  1. Comment ajouter une nouvelle ligne à la fin d'un fichier ?

  2. Comment puis-je lier symboliquement un fichier sous Linux?

  3. commande tr - comment remplacer la chaîne \n par une nouvelle ligne réelle (\n)

  4. Comment puis-je ajouter une chaîne au début de chaque ligne dans un fichier ?

  5. Comment puis-je ajouter un utilisateur régulier au fichier sudoers ?

Comment puis-je corriger les autorisations de mes fichiers ?

comment puis-je différencier deux sections du même fichier ?

Comment puis-je m'assurer que mon système utilise le fichier ~/.screenrc ?

Comment puis-je obtenir la longueur d'un fichier vidéo à partir de la console ?

Comment puis-je résoudre l'erreur Impossible d'exécuter le fichier binaire ?

Comment imprimer la dernière ligne d'un fichier compressé gz dans la ligne de commande ?