web-dev-qa-db-fra.com

Comment puis-je imprimer une sortie multiligne sur la même ligne?

Existe-t-il une méthode permettant d’imprimer une sortie multiligne (sortie unique) sur la même ligne?

Par exemple, si le résultat est:

abc
def
qwerty

Est-il possible d'imprimer:

abcdefqwerty 
13
Shrinidhi Kulkarni

Vous pouvez supprimer toutes les occurrences de caractères d'un jeu donné avec tr -d. Pour supprimer le caractère de nouvelle ligne, utilisez:

tr -d '\n'

Comme toujours, vous pouvez utiliser la redirection d'entrée et de sortie et les canaux pour lire ou écrire dans des fichiers et d'autres processus.

Si vous souhaitez conserver la dernière ligne, vous pouvez simplement la rajouter avec echo ou printf '\n', e. g.:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt
12
David Foerster

Plusieurs façons. Pour illustrer mon propos, j’ai sauvegardé votre exemple dans file:

$ cat file | tr -d '\n'
abcdefqwerty$ 
$ cat file | Perl -pe 's/\n//'
abcdefqwerty$ 

Cela supprime tous les caractères de nouvelle ligne, y compris le dernier. Vous pourriez plutôt vouloir faire:

$ printf "%s\n" "$(cat file | Perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty
10
terdon

Vous pouvez diriger votre sortie multiligne par awk

awk '{printf "%s",$0} END {print ""}'

ou utilisez sed:

sed ':a;N;$!ba;s/\n//g'

Exemple d'exécution

$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'              
1234

Lectures supplémentaires: supprime le saut de ligne en utilisant AWK · serverfault.SE

7
dessert

Aussi your_command | paste -sd '' qui préserve la nouvelle ligne.

4
glenn jackman

Si vous voulez utiliser Perl pour cela, vous pouvez utiliser sa fonction chompname__:

Perl -pe chomp

Quelques détails supplémentaires, pour ceux qui sont intéressés.

Vous pouvez passer un ou plusieurs noms de fichiers comme arguments ultérieurs.

Perl -pe chomp file1file2file3

Dans certains cas, vous ne voudrez peut-être pas faire cela , mais vous pouvez diriger ou rediriger vers cette commande à la place. (Ces capacités - et cette mise en garde - s'appliquent toutes à toute autre solution basée sur Perl -p ou Perl -n.)

Donc, si vous voulez traiter la sortie de l'exécution some-command:

some-command | Perl -pe chomp

C'est potentiellement plus rapide que la commande Perl dans réponse de terdon . Les caractères de nouvelle ligne (représentés par \n) apparaissent uniquement à la fin des lignes dans cette situation - car ils correspondent à ce que Perl utilise pour décider où chaque ligne se termine. s/\n// recherche dans toute la ligne les nouvelles lignes, alors que chompsupprime simplement celui qui se trouve à la fin (le cas échéant, la dernière ligne pouvant en avoir ou non).

Les performances ne sont peut-être pas la raison principale pour préférer chompname__. La commande Perldans réponse de terdon ne serait que légèrement plus lente, sauf si vous traitez un fichier énorme avec de très longues lignes. Et si vous avez besoin de vitesse, façon de David Foerster est probablement encore plus rapide. chompest cependant exactement le bon outil pour cela si vous utilisez Perl, et je pense que l'intention de chompest plus claire que celle de s/\n//. En fin de compte, il n’ya probablement pas de réponse objective quant à la meilleure solution.

Imprimer une nouvelle ligne finale.

Cependant, je déconseille l'utilisation de la substitution de commande ($()) simplement pour assurer l'impression d'un retour à la ligne final. À moins que le texte que vous traitez soit court, il risque d'être assez lent (il doit collecter tout le texte à la fois, puis l'imprimer), ce qui rend votre commande plus difficile à comprendre. Au lieu de cela, vous pouvez faire comme l’a suggéré David Foerster et exécuter ensuite echoou printf '\n'.

Perl -pe chomp; echo

Si vous diffusez à partir de ou (comme le montre David Foerster) en redirigeant à partir de , vous pouvez l'enfermer dans {;} de sorte que la sortie des deux commandes est prise ensemble. Si vous ne faites que l’imprimer sur le terminal, vous pouvez l’exécuter exactement comme indiqué ci-dessus. Cela fonctionne même si vous redirigez vers la commande, car echoname __/printf '\n' ne lit aucune entrée. C'est-à-dire que cela fonctionne:

some-command | Perl -pe chomp; echo

Ici, vous ne pouvez pas simplement supprimer le {;}:

{ Perl -pe chomp; echo; } | some-other-command

Ou, si vous préférez, vous pouvez faire Perlimprimer le saut de ligne final lui-même. Comme avec les commandes Perlet echodans {;}, cette approche fonctionne même si vous pipez ou redirigez à partir de , il (et, comme all approche, ça marche quand on piping à aussi):

Perl -wpe 'chomp; END { print "\n" }'

Notez que la réponse de la commande in terdon fonctionne bien avec ces méthodes d’impression de la nouvelle ligne finale. Par exemple:

Perl -pe 's/\n//'; echo
Perl -pe 's/\n//; END { print "\n" }'
2
Eliah Kagan

Utilisation de Shell uniquement:

while IFS= read -r line || [ -n "$line" ]; do printf "%s"  "$line"; done < inputfile.txt
1

Cette réponse apporte une solution au problème que vous essayez de créer: pourquoi bash supprime-t-il\n dans $ (fichier cat)?

Si vous tapez cat myfile.txt, vous verrez:

abc
def
ghi

Mais si vous tapez echo $(cat myfile.txt), vous verrez:

abc def ghi

Notez que cette méthode insère un espace où se trouvaient auparavant de nouvelles lignes distinctes. Cela facilite la lecture de la sortie, mais n’adhère pas strictement à la portée de votre question.

1
WinEunuuchs2Unix

Si vous utilisez Bash, vous pouvez le faire sans outil externe.

x=($(echo line1; echo line2))
echo "${x[@]}"

Résultat:

line1 line2

La première commande transforme la sortie multiligne dans un tableau, la seconde développe le tableau en plusieurs arguments sur une ligne.

0
osexp2003