Comment concaténer plusieurs lignes de sortie d'une ligne? [dupliquer]

cette question a déjà une réponse ici:

  • Comment concaténer toutes les lignes d'un fichier en Bash? 8 réponses

si j'exécute la commande cat file | grep pattern , j'obtiens de nombreuses lignes de sortie. Comment concaténer toutes les lignes en une seule ligne, remplaçant chaque "n" avec "" " (fin avec " suivi de l'espace)?

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

65
demandé sur kenorb 2013-03-23 01:27:51

7 réponses

utilisez tr '\n' ' ' pour traduire tous les caractères newline dans les espaces:

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

Note: grep lit des fichiers, cat concatène des fichiers. Pas de cat file | grep !

Edit:

tr ne peut traiter que des traductions à caractère unique. Vous pouvez utiliser awk pour changer le séparateur d'enregistrement de sortie comme:

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

ce serait transform:

one
two 
three

à:

one" two" three" 
112
répondu Chris Seymour 2013-03-22 21:42:19

sortie de tuyauterie à xargs concaténera chaque ligne de sortie à une seule ligne avec des espaces:

grep pattern file | xargs

ou toute commande, par exemple: ls | xargs . La limite par défaut de la sortie xargs est d'environ 4096 caractères, mais peut être augmentée par exemple. xargs -s 8192 .

39
répondu bluebadge 2014-08-11 20:42:34

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

echo $(cat file)
27
répondu user1699917 2015-11-05 09:11:12

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 produit pas dans file )

15
répondu sehe 2013-03-22 21:41:31

Voici la méthode utilisant ex Editeur:

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

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

    $ ex +%j -scwq file
    

    Note: cela concaténera toutes les lignes à l'intérieur du fichier it-self!

2
répondu kenorb 2016-12-20 22:19:26

probablement la meilleure façon de le faire est d'utiliser l'outil " awk "qui générera la sortie en une seule ligne

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

il va fusionner toutes les lignes en une seule avec délimiteur d'espace

1
répondu vyahello 2018-03-12 11:22:37

il s'agit d'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
0
répondu Richard Gomes 2018-08-02 12:26:20