web-dev-qa-db-fra.com

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

Si je lance la commande cat file | grep pattern, je reçois beaucoup de lignes de sortie. Comment concaténer toutes les lignes en une seule ligne, en remplaçant efficacement chaque "\n" par "\" " (se termine par " suivi d'un espace)?

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

113
T. Webster

Utilisez tr '\n' ' ' pour traduire tous les caractères de nouvelle ligne en espaces:

$ grep pattern file | tr '\n' ' '

Remarque: grep lit les fichiers, cat concatène des fichiers. Ne faites pas cat file | grep!

Edit:

tr ne peut gérer que les conversions d'un seul caractère. Vous pouvez utiliser awk pour modifier le séparateur d'enregistrement de sortie comme suit:

$ grep pattern file | awk '{print}' ORS='" '

Cela transformerait:

one
two 
three

à:

one" two" three" 
174
Chris Seymour

La sortie de tuyauterie vers xargs concaténera chaque ligne de sortie en une seule ligne avec des espaces:

grep pattern file | xargs

Ou toute commande, par exemple. ls | xargs. La limite par défaut de xargs sortie est ~ 4096 caractères, mais peut être augmentée avec par exemple. xargs -s 8192.

grepxargs

52
bluebadge

En bash echo sans guillemets supprime les retours à la ligne, les tabulations et les espaces

echo $(cat file)
45
user1699917

Cela pourrait être ce que vous voulez

cat file | grep pattern | paste -sd' '

En ce qui concerne votre édition, je ne suis pas sûr de ce que cela signifie, peut-être ceci?

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g'

(cela suppose que ~ ne se produise pas dans file)

17
sehe

Ceci est un exemple qui produit une sortie séparée par des virgules. Vous pouvez remplacer la virgule par le séparateur dont vous avez besoin.

cat <<EOD | xargs | sed 's/ /,/g'
> 1
> 2
> 3
> 4
> 5
> EOD

produit:

1,2,3,4,5
2
Richard Gomes

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

  • J dans toutes les lignes et p apparaît sur la sortie standard:

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

    $ ex +%j -scwq file
    

    Remarque: Ceci concaténera toutes les lignes du fichier lui-même!

1
kenorb

La meilleure façon de le faire est probablement d'utiliser l'outil 'awk' qui générera une 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.

0
Vladimir Yahello