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 ?
Réponses
Trop de publicités?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
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+$//'
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:]]}
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)
- Réponses précédentes
- Plus de réponses