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, en remplaçant efficacement chacune "\n"
par "\" "
(fin par "
suivi d'un espace)?
cat file | grep pattern | xargs sed s/\n/ /g
ne fonctionne pas pour moi.
sed
script entre guillemets simples pour que Bash ne le dérange pas (puisque lessed s/\n/ /g
appelssed
avec deux arguments, à savoirs/n/
et/g
); (2) puisque vous voulez la sortiecat file | grep pattern
être l' entrée àsed
, pas les arguments àsed
, vous devez éliminerxargs
; et (3) ce n'est pas nécessairecat
ici, cargrep
peut prendre un nom de fichier comme deuxième argument. Donc, vous auriez dû essayergrep pattern file | sed 's/\n/ /g'
. (Dans ce cas, cela n'aurait pas fonctionné, pour les raisons données sur le lien ci-dessus, mais maintenant vous savez pour l'avenir.)Réponses:
Utilisez
tr '\n' ' '
pour traduire tous les caractères de nouvelle ligne en espaces:Remarque:
grep
lit les fichiers,cat
concatène les fichiers. Pascat file | grep
!Éditer:
tr
ne peut gérer que les traductions d'un seul caractère. Vous pouvez utiliserawk
pour changer le séparateur d'enregistrement de sortie comme:Cela transformerait:
à:
la source
echo ""
à la fin pour ajouter une nouvelle ligne avant le texte d'invite."
, il apparaît commeone" two" three"
, mais je voudrais qu'il apparaisse commeone" two" three
. Notez que les trois derniers n'ont pas de parenthèses. Des idées?sed '$s/..$//'
pour supprimer les 2 derniers caractères de la dernière ligne.--delete
option car la valeur par défaut attend deux arguments. par exempletr --delete '\n'
.La sortie de tuyauterie vers
xargs
concaténera chaque ligne de sortie en une seule ligne avec des espaces:Ou n'importe quelle commande, par exemple.
ls | xargs
. La limite dexargs
sortie par défaut est d'environ 4096 caractères, mais peut être augmentée avec par exemple.xargs -s 8192
.grep xargs
la source
| tr '\n' ' '
ne fonctionnait pas pour moi lorsqu'il est appelé via laphp exec
fonction. Il ignorait tr, et donnait juste le dernier match de grep.| xargs
travaillé.Dans bash
echo
sans guillemets, supprimez les retours chariot, les tabulations et les espaces multiplesla source
IFS="$(printf '\n\t')"
echo $(<file)
... utiliser l'écho n'est pas seulement plus soigné que l'utilisationtr '\n' ' '
, mais aussi mieux (pensez aux\r\n
fins de ligne). @aggsol vous pouvez juste direIFS=$'\n\t'
Cela pourrait être ce que tu veux
Quant à votre modification, je ne suis pas sûr de ce que cela signifie, peut-être ceci?
(cela suppose que
~
cela ne se produit pas dansfile
)la source
cat file
sera réellementcat
, ni même un fichier. (Je viens de quitter cette partie inchangée car il était hors de propos à la question)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.
produit:
la source
Voici la méthode utilisant l'
ex
éditeur (partie de Vim ):J oin toutes les lignes et p Rint à la sortie standard:
J oin toutes les lignes en place (dans le fichier):
Remarque: Cela concaténera toutes les lignes à l'intérieur du fichier lui-même!
la source
Les moyens les plus rapides et les plus simples que je connaisse pour résoudre ce problème:
Lorsque nous voulons remplacer le caractère de nouvelle ligne
\n
par l'espace :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
Lorsque nous voulons remplacer un caractère par un autre exactement un caractère :
Lorsque nous voulons remplacer un caractère par plusieurs caractères :
Tout d'abord, nous remplaçons les caractères de nouvelle ligne
\n
pour les tildes~
(ou choisissons un autre caractère unique non présent dans le texte), puis nous remplaçons les caractères tilde par d'autres caractères (many_characters
) et nous le faisons pour chaque tilde (drapeaug
).la source
La meilleure façon de le faire est probablement d'utiliser l'outil 'awk' qui générera une sortie sur une ligne
Il fusionnera toutes les lignes en une seule avec un délimiteur d'espace
la source
{print}
puisque c'est l'action par défaut de awk.Voici une autre méthode simple utilisant
awk
:De plus, si votre fichier contient des colonnes, cela donne un moyen simple de concaténer uniquement certaines colonnes:
la source
Sur Red Hat Linux, j'utilise juste echo:
echo $ (cat / un / fichier / nom)
Cela me donne tous les enregistrements d'un fichier sur une seule ligne.
la source