web-dev-qa-db-fra.com

Comment ajouter à la fin des lignes contenant un motif avec sed ou awk?

Voici un exemple de fichier:

somestuff...
all: thing otherthing
some other stuff

Ce que je veux faire, c'est ajouter à la ligne qui commence par all: comme ça:

somestuff...
all: thing otherthing anotherthing
some other stuff
81
yasar

Ça marche pour moi

sed '/^all:/ s/$/ anotherthing/' file

La première partie est un motif à rechercher et la deuxième partie est la substitution d'un sed ordinaire par $ pour la fin d'une ligne.

Si vous souhaitez modifier le fichier au cours du processus, utilisez -i option

sed -i '/^all:/ s/$/ anotherthing/' file

Ou vous pouvez le rediriger vers un autre fichier

sed '/^all:/ s/$/ anotherthing/' file > output
158
user219882

Cela devrait fonctionner pour vous

sed -e 's_^all: .*_& anotherthing_'

En utilisant la commande s (substitute), vous pouvez rechercher une ligne qui satisfait une expression régulière. Dans la commande ci-dessus, & représente la chaîne correspondante.

9
izidor

Vous pouvez ajouter le texte à $0 in awk si elle correspond à la condition:

awk '/^all:/ {$0=$0" anotherthing"} 1' file

Explication

  • /patt/ {...} si la ligne correspond au modèle donné par patt, effectuez les actions décrites dans {}.
  • Dans ce cas: /^all:/ {$0=$0" anotherthing"} si la ligne commence (représentée par ^) avec all:, puis ajoutez anotherthing à la ligne.
  • 1 comme condition vraie, déclenche l'action par défaut de awk: affiche la ligne en cours (print $0). Cela se produira toujours, de sorte que la ligne d'origine ou la ligne modifiée sera imprimée.

Tester

Pour votre entrée donnée, il retourne:

somestuff...
all: thing otherthing anotherthing
some other stuff

Notez que vous pouvez également fournir le texte à ajouter dans une variable:

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff
7
fedorqui

En bash:

while read -r line ; do
    [[ $line == all:* ]] && line+=" anotherthing"
    echo "$line"
done < filename
5
glenn jackman

Voici une autre solution simple utilisant sed.

$ sed -i 's/all.*/& anotherthing/g' filename.txt

Explication:

all. * signifie toutes les lignes commençant par 'all'.

& représente le match (c'est-à-dire la ligne complète qui commence par 'tous')

puis sed remplace l'ancien par le dernier et ajoute le mot "Anotherthing"

3
chenchuk

Solution avec awk:

awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file

Simplement: si la ligne commence par all, imprimez la ligne plus "anotherthing", sinon imprimez seulement la ligne.

3
Manlio