342 votes

Bash : Supprimer le saut de ligne de la sortie

Lorsque j'exécute des commandes en Bash (ou pour être plus précis, wc -l < log.txt ), la sortie contient un saut de ligne. Comment puis-je m'en débarrasser ?

460voto

Steve Points 18420

Si le résultat attendu est une simple ligne vous pouvez simplement supprimer tous les caractères de fin de ligne de la sortie. Il n'est pas rare que le tuyau soit dirigé vers le fichier tr ou à Perl si l'on préfère :

wc -l < log.txt | tr -d '\n'

wc -l < log.txt | perl -pe 'chomp'

Vous pouvez également utiliser la substitution de commande pour supprimer la nouvelle ligne qui suit :

echo -n "$(wc -l < log.txt)"

printf "%s" "$(wc -l < log.txt)"

Si le résultat attendu peut contenir plusieurs lignes Vous avez une autre décision à prendre :

Si vous souhaitez supprimer PLUSIEURS caractères de fin de fichier, utilisez à nouveau la substitution cmd :

printf "%s" "$(< log.txt)"

Si vous souhaitez supprimer strictement le dernier caractère de nouvelle ligne d'un fichier, utilisez Perl :

perl -pe 'chomp if eof' log.txt

Notez que si vous êtes certain d'avoir un caractère de fin de ligne que vous voulez supprimer, vous pouvez utiliser head de GNU coreutils pour sélectionner tout sauf le dernier octet. Cela devrait être assez rapide :

head -c -1 log.txt

De plus, pour être complet, vous pouvez rapidement vérifier où se trouvent vos nouvelles lignes (ou d'autres caractères spéciaux) dans votre fichier en utilisant la fonction cat et le drapeau "show-all -A . Le signe du dollar indique la fin de chaque ligne :

cat -A log.txt

96voto

Satya Points 2222

D'une seule manière :

wc -l < log.txt | xargs echo -n

30voto

Tom Hale Points 5950

Si vous souhaitez supprimer seulement la dernière ligne nouvelle , le tuyau passe à travers :

sed -z '$ s/\n$//'

sed n'ajoutera pas de \0 jusqu'à la fin du flux si le délimiteur est fixé à NUL via -z alors que pour créer un fichier texte POSIX (défini comme se terminant par un \n ), il produira toujours un \n sans -z .

Eg :

$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender

Et pour prouver qu'il n'y a pas NUL ajouté :

$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72                        foo.bar

Pour supprimer les multiples lignes de séparation , le tuyau passe à travers :

sed -Ez '$ s/\n+$//'

24voto

Andrew Taranov Points 174

Il existe également un support direct pour l'élimination des espaces blancs dans la rubrique Substitution de variables Bash :

testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}

14voto

Rastislav Hasicek Points 197

Si vous voulez imprimer la sortie de n'importe quel élément en Bash sans fin de ligne, vous l'affichez avec l'option -n commutateur.

Si vous l'avez déjà dans une variable, vous pouvez l'afficher à l'aide de la commande nouvelle ligne à la fin du texte recadré :

$ testvar=$(wc -l < log.txt)
$ echo -n $testvar

Vous pouvez également le faire en une seule ligne :

$ echo -n $(wc -l < log.txt)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X