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
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
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
Vous pouvez diriger votre sortie multiligne par awk
awk '{printf "%s",$0} END {print ""}'
ou utilisez sed
:
sed ':a;N;$!ba;s/\n//g'
$ 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
Aussi your_command | paste -sd ''
qui préserve la nouvelle ligne.
Si vous voulez utiliser Perl pour cela, vous pouvez utiliser sa fonction chomp
name__:
Perl -pe chomp
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 chomp
supprime 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 chomp
name__. La commande Perl
dans 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. chomp
est cependant exactement le bon outil pour cela si vous utilisez Perl, et je pense que l'intention de chomp
est plus claire que celle de s/\n//
. En fin de compte, il n’ya probablement pas de réponse objective quant à la meilleure solution.
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 echo
ou 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 echo
name __/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 Perl
imprimer le saut de ligne final lui-même. Comme avec les commandes Perl
et echo
dans {
;}
, 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" }'
Utilisation de Shell uniquement:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
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.
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.