web-dev-qa-db-fra.com

Comment supprimer le caractère de nouvelle ligne à la fin du fichier?

Permettez-moi de préciser le caractère de nouvelle ligne:

$ echo Hello > file1 ; cat file1
Hello
$ echo -n  Hello > file2 ; cat file2
Hello$ 

Ici, vous pouvez voir que file1 a un caractère de nouvelle ligne à la fin tandis que file2 non.

Supposons maintenant que j'en ai un file:

$ cat file
Hello
Welcome to
Unix
$

Et je veux ajouter and Linux à la fin du fichier, puis echo " and Linux" >> file sera ajouté à la nouvelle ligne. Mais je veux que la dernière ligne soit Unix and Linux

Donc, pour contourner ce problème, je souhaite supprimer le caractère de nouvelle ligne à la fin du fichier. Par conséquent, comment supprimer le caractère de nouvelle ligne à la fin du fichier?

45
Pandya

Si tout ce que vous voulez faire est d'ajouter du texte à la dernière ligne, c'est très simple avec sed. Remplacer $ (correspondance de motifs à la fin de la ligne) par le texte que vous souhaitez ajouter, uniquement sur les lignes de la plage $ (ce qui signifie la dernière ligne).

sed '$ s/$/ and Linux/' <file >file.new &&
mv file.new file

qui sur Linux peut être raccourci en

sed -i '$ s/$/ and Linux/' file

Si vous voulez supprimer le dernier octet d'un fichier, Linux (plus précisément GNU coreutils) propose la commande truncate , ce qui rend cela très simple .

truncate -s -1 file

Une façon POSIX de le faire est avec dd. Déterminez d'abord la longueur du fichier, puis tronquez-la à un octet de moins.

length=$(wc -c <file)
dd if=/dev/null of=file obs="$((length-1))" seek=1

Notez que ces deux tronquent inconditionnellement le dernier octet du fichier. Vous voudrez peut-être d'abord vérifier qu'il s'agit d'une nouvelle ligne:

length=$(wc -c <file)
if [ "$length" -ne 0 ] && [ -z "$(tail -c -1 <file)" ]; then
  # The file ends with a newline or null
  dd if=/dev/null of=file obs="$((length-1))" seek=1
fi

Cependant, vous pouvez supprimer le caractère de nouvelle ligne de la ligne par tr -d '\n':

$ echo -e "Hello"
Hello
$ echo -e "Hello" | tr -d '\n'
Hello$

Vous pouvez supprimer le caractère de nouvelle ligne à la fin du fichier en utilisant la méthode simple suivante:

  1. head -c -1 file

    De man head:

    -c, --bytes=[-]K
              print the first K bytes of each file; with the leading '-',
              print all but the last K bytes of each file
    
  2. truncate -s -1 file

    de man truncate:

    -s, --size=SIZE
              set or adjust the file size by SIZE
    
    SIZE is an integer and optional unit (example: 10M is 10*1024*1024).
    Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).
    
    SIZE  may  also be prefixed by one of the following modifying characters: 
    '+' extend by, '-' reduce by, '<' at most, '>' at least, '/' round down to multiple of, '%' round up to multiple of.
    
21
Pandya

Vous pouvez y parvenir avec Perl comme:

Perl -pi -e 'chomp if eof' myfile

Comparé à truncate ou dd cela ne vous laissera pas un fichier cassé si myfile n'avait en fait pas de retour à la ligne.

(la réponse est construite à partir de le commentaire , et basée sur cette réponse )

16
Hi-Angel

Voici une façon avec sed - sur la dernière ($) ligne du fichier, recherchez et remplacez tout et n'importe quoi (.*) avec "ce que vous avez trouvé" suivi de "et Linux":

sed '$s/\(.*\)/\1 and Linux/' file

Une solution encore plus simple, gracieuseté de Isaac , est:

sed '$s/$/ and Linux/' file

Ceci remplace la fin de ligne (symbolique) par le texte donné.

3
Jeff Schaller