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.
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"
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
.
En bash echo sans guillemets supprime les retours à la ligne, les tabulations et les espaces
echo $(cat file)
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
)
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
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!
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.