web-dev-qa-db-fra.com

Bash: Supprimez les sauts de ligne à la fin de la sortie

Lorsque j'exécute des commandes dans Bash (ou pour être spécifique, wc -l < log.txt), la sortie contient un saut de ligne après celle-ci. Comment puis-je m'en débarrasser?

153
hexacyanide

Si votre sortie attendue est une seule ligne, vous pouvez simplement supprimer tous les caractères de nouvelle ligne de la sortie. Il ne serait pas rare de faire appel à l'utilitaire 'tr' ou à Perl si vous le préférez:

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 de fin:

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

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

Veuillez noter que je ne suis pas d'accord avec la décision du PO de choisir la réponse acceptée. Je pense qu'il faut éviter d'utiliser "xargs" dans la mesure du possible. Oui, c'est un jouet cool. Non, vous n'en avez pas besoin ici.


Si votre sortie attendue peut contenir plusieurs lignes, vous avez une autre décision à prendre:

Si vous souhaitez supprimer plusieurs caractères de nouvelle ligne de la fin du fichier, utilisez à nouveau la substitution de cmd:

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

Si vous voulez 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 souhaitez supprimer, vous pouvez utiliser 'head' dans GNU coreutils pour tout sélectionner à l'exception du dernier octet. Cela devrait être assez rapide:

head -c -1 log.txt

En outre, pour des raisons d'exhaustivité, vous pouvez rapidement vérifier où se trouvent vos caractères de nouvelle ligne (ou autres caractères spéciaux) dans votre fichier à l'aide de "cat" et de l'indicateur "show-all". Le caractère du signe dollar indiquera la fin de chaque ligne:

cat -A log.txt
197
Steve

Une manière:

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

Il existe également une prise en charge directe de la suppression des espaces dans substitution de variable Bash :

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

Si vous affectez sa sortie à une variable, bash supprime automatiquement les espaces:

linecount=`wc -l < log.txt`
9
nneonneo

printf coupe déjà la nouvelle ligne pour vous:

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

Détail:

  • printf imprimera votre contenu à la place de l'espace réservé à la chaîne %s.
  • Si vous ne lui dites pas d'imprimer une nouvelle ligne (%s\n), ce ne sera pas le cas.
9
zero2cx

Si vous souhaitez imprimer une sortie de n'importe quoi dans Bash sans fin de ligne, vous la renvoyez en écho avec le commutateur -n.

Si vous l'avez déjà dans une variable, faites-le ensuite écho avec le fin de nouvelle ligne rogné:

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

Ou vous pouvez le faire en une seule ligne, à la place:

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