Comment append à 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 append à la ligne qui commence par all: comme ceci:

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

Cela fonctionne pour moi

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

La première partie est un modèle à rechercher et la deuxième partie est une substitution sed ordinaire utilisant $ pour la fin d’une ligne.

Si vous voulez changer le fichier pendant le processus, utilisez l’option -i

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

Ou vous pouvez le redirect vers un autre fichier

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

Cela devrait fonctionner pour vous

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

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

Vous pouvez append le texte à $0 dans awk s’il 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 ajoute un autre anotherthing à la ligne.
  • 1 comme condition vraie, déclenche l’action par défaut de awk : imprime la ligne courante ( print $0 ). Cela se produira toujours, donc il imprimera la ligne originale ou la ligne modifiée.

Tester

Pour votre saisie, il renvoie:

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

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

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

En bash:

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

Solution avec awk:

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

Simplement: si la ligne commence par all les lignes, imprimez la ligne plus “anotherthing”, sinon imprimez simplement la ligne.

Voici une autre solution simple utilisant sed.

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

Explication:

all. * signifie que toutes les lignes commencent par «tous».

& représente le match (c.-à-d. la ligne complète qui commence par “tous”)

alors sed remplace le premier par le plus tard et ajoute le mot “anotherthing”