228 votes

Comment concaténer plusieurs lignes de sortie en une seule ligne ?

Si je lance la commande cat file | grep pattern j'obtiens de nombreuses lignes de sortie. Comment concaténer toutes les lignes en une seule, en remplaçant effectivement chaque ligne par une autre ? "\n" con "\" " (terminer par " suivi d'un espace) ?

cat file | grep pattern | xargs sed s/\n/ /g ne fonctionne pas pour moi.

7voto

simhumileco Points 5383

Les moyens les plus rapides et les plus simples que je connaisse pour résoudre ce problème :

Quand nous voulons remplacer le caractère de la nouvelle ligne \n avec l'espace :

xargs < file

xargs a ses propres limites sur le nombre de caractères par ligne et le nombre de tous les caractères combinés, mais nous pouvons les augmenter. Les détails peuvent être trouvés en exécutant cette commande : xargs --show-limits et bien sûr dans le manuel : man xargs

Quand nous voulons remplacer un caractère par un autre d'exactement un caractère :

tr '\n' ' ' < file

Quand nous voulons remplacer un caractère par plusieurs caractères :

tr '\n' '~' < file | sed s/~/many_characters/g

Tout d'abord, nous remplaçons les caractères de nouvelle ligne \n pour les tildes ~ (ou choisir un autre caractère unique non présent dans le texte), puis nous remplaçons les caractères tilde par tout autre caractère ( many_characters ) et nous le faisons pour chaque tilde (drapeau g ).

5voto

ascendants Points 909

Voici une autre méthode simple utilisant awk :

# cat > file.txt
a
b
c

# cat file.txt | awk '{ printf("%s ", $0) }'
a b c

En outre, si votre fichier comporte des colonnes, cela permet de concaténer facilement certaines colonnes seulement :

# cat > cols.txt
a b c
d e f

# cat cols.txt | awk '{ printf("%s ", $2) }'
b e

5voto

JoL Points 268

J'aime le xargs mais s'il est important de ne pas réduire les espaces, on peut le faire à la place :

sed ':b;N;$!bb;s/\n/ /g'

Cela remplacera les retours à la ligne par des espaces, sans substituer la dernière fin de ligne comme tr '\n' ' ' serait.

Cela vous permet également d'utiliser d'autres chaînes de jonction que l'espace, comme une virgule, etc. xargs ne peut pas faire :

$ seq 1 5 | sed ':b;N;$!bb;s/\n/,/g'
1,2,3,4,5

4voto

kenorb Points 2464

Voici la méthode qui utilise ex éditeur (partie de Vim ):

  • J oin de toutes les lignes et p rint à la sortie standard :

    $ ex +%j +%p -scq! file
  • J oin toutes les lignes en place (dans le fichier) :

    $ ex +%j -scwq file

    Note : Ceci concaténera toutes les lignes à l'intérieur du fichier lui-même !

0voto

La meilleure façon de le faire est probablement d'utiliser l'outil 'awk' qui génère la sortie sur une seule ligne.

$ awk ' /pattern/ {print}' ORS=' ' /path/to/file

Il fusionnera toutes les lignes en une seule avec un délimiteur d'espace.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X