Existe-t-il une méthode pour imprimer une sortie multiligne (sortie unique) sur la même ligne?
Par exemple, si la sortie est:
abc
def
qwerty
Est-il possible d'imprimer:
abcdefqwerty
la source
Existe-t-il une méthode pour imprimer une sortie multiligne (sortie unique) sur la même ligne?
Par exemple, si la sortie est:
abc
def
qwerty
Est-il possible d'imprimer:
abcdefqwerty
Vous pouvez supprimer toutes les occurrences de personnages d'un ensemble 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 des canaux pour lire ou écrire dans des fichiers et d'autres processus.
Si vous souhaitez conserver la dernière nouvelle ligne, vous pouvez simplement l'ajouter à nouveau avec echo
ou printf '\n'
, par exemple:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
Plusieurs façons. Pour illustrer, j'ai enregistré 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
printf
+cat
+perl
est beaucoup mieux géré via unperl -pe 's/\n//;END{printf "\n"}' input.txt
processus unique, pas de substitution de commande et de confusion avec des guillemets, et pas d'UUOC. Peut-être.Vous pouvez diriger votre sortie multiligne via
awk
ou utilisez
sed
:Exemple d'exécution
Pour en savoir plus: supprimer le saut de ligne à l'aide d'AWK · serverfault.SE
la source
Également
your_command | paste -sd ''
qui préserve la nouvelle ligne de fin.la source
Si vous souhaitez utiliser Perl pour cela, vous pouvez utiliser sa
chomp
fonction: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.
Dans certains cas, vous ne souhaiterez peut-être pas le faire , mais vous pouvez à la place rediriger ou rediriger vers cette commande. (Ces capacités - et cette mise en garde - s'appliquent également à toute autre solution
perl -p
ouperl -n
solution basée.)Donc, si vous souhaitez traiter la sortie de l'exécution
some-command
:C'est potentiellement plus rapide que la commande Perl dans la réponse de terdon . Les caractères de nouvelle ligne (représentés par
\n
) n'apparaissent qu'à la fin des lignes dans cette situation - car ils sont ce que Perl utilise pour décider de la fin de chaque ligne.s/\n//
recherche dans toute la ligne des sauts de ligne, tout en supprimantchomp
simplement celle à la fin (le cas échéant, car la dernière ligne peut ou non en avoir une).La performance n'est peut-être pas vraiment la principale raison de préférer
chomp
. Laperl
commande dans la 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, le chemin 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 dechomp
est plus claire que celle des/\n//
. En fin de compte, il n'y a probablement pas de réponse objective quant à la meilleure solution.Impression d'une nouvelle ligne finale.
Cependant, je déconseille l'utilisation de la substitution de commandes (
$(
)
) juste pour garantir l'impression d'un retour à la ligne en fin de ligne. À moins que le texte que vous traitez soit court, cela risque d'être assez lent - il doit collecter tout le texte à la fois, puis l'imprimer - et cela rend votre commande plus difficile à comprendre. Au lieu de cela, vous pouvez faire ce que David Foerster a suggéré et exécuterecho
ouprintf '\n'
après.Si vous redirigez depuis ou (comme le montre David Foerster) la redirection à partir de cette commande, vous pouvez l'enfermer de
{
;}
sorte que la sortie des deux commandes soit prise ensemble. Si vous l'imprimez simplement sur le terminal, vous pouvez l'exécuter exactement comme indiqué ci-dessus. Cela fonctionne même si vous canalisez ou redirigez vers la commande, carecho
/printf '\n'
ne lit aucune entrée. Autrement dit, cela fonctionne:Pendant que vous êtes ici, vous ne pouvez pas simplement supprimer
{
;}
:Ou, si vous préférez, vous pouvez faire
perl
imprimer la nouvelle ligne finale elle-même. Comme les enfermantperl
etecho
commandes{
;}
, cette approche fonctionne même si vous êtes la tuyauterie ou redirigeant de (et, comme toutes les approches, cela fonctionne quand vous êtes tuyauterie à elle aussi):Notez que la commande dans la réponse de terdon fonctionne également très bien avec ces méthodes d'impression du retour à la ligne final. Par exemple:
la source
perl -wpe 'chomp; END { print "\n" }
est le même processus, un avantage mineur par rapport à l'ajout d'un échoUtilisation de manière shell uniquement:
la source
Cette réponse a 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:Mais si vous tapez,
echo $(cat myfile.txt)
vous verrez:Notez que cette méthode insère un espace où se trouvaient auparavant les nouvelles lignes distinctes. Cela rend la sortie plus facile à lire mais n'adhère pas strictement à la portée de votre question.
la source
Si vous utilisez Bash, vous pouvez le faire sans aucun outil externe.
Résultat:
La première commande transforme la sortie multiligne en un tableau, la seconde commande étend le tableau en plusieurs arguments sur une seule ligne.
la source