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

89

Voici un fichier d'exemple:

somestuff...
all: thing otherthing
some other stuff

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

somestuff...
all: thing otherthing anotherthing
some other stuff
Yasar
la source

Réponses:

166

Cela fonctionne pour moi

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

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

Si vous souhaitez modifier le fichier pendant le processus, utilisez l' -ioption

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

Ou vous pouvez le rediriger vers un autre fichier

sed '/^all:/ s/$/ anotherthing/' file > output
user219882
la source
Le simple fait d'ajouter quelque chose mène à une nouvelle ligne, remplacer est la bonne façon.
zhy
10

Cela devrait fonctionner pour vous

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

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

izidor
la source
9

Vous pouvez ajouter le texte $0dans 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, alors effectuez les actions décrites dans {}.
  • Dans ce cas: /^all:/ {$0=$0" anotherthing"}si la ligne commence (représentée par ^) par all:, alors ajoutez anotherthingà la ligne.
  • 1comme condition vraie, déclenche l'action par défaut de awk: imprimer la ligne courante ( print $0). Cela se produira toujours, donc il imprimera soit la ligne d'origine, soit la ligne modifiée.

Tester

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

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
fedorqui 'Alors arrête de nuire
la source
Sur Solaris, vous obtiendrez l'erreur:awk: can't set $0
ceving
@ceving alors vous pouvez utiliser /usr/xpg4/bin/awkquel est le "bon" awk.
fedorqui 'SO arrêtez de nuire'
6

Dans bash:

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

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 la correspondance (c'est-à-dire la ligne complète commençant par «tous»)

puis sed remplace le premier par le plus tard et ajoute le mot `` autre chose ''

chenchuk
la source
3

Solution avec awk:

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

Simplement: si la ligne commence par allimprimer la ligne plus "autre chose", sinon n'imprimez que la ligne.

Manlio
la source
4
Vous pouvez raccourcir cela à:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn jackman
2
@ Prométhée, un script awk est composé de condition {actions}paires. Si le conditionest omis, les actions sont exécutées pour chaque enregistrement. Si les {actions}sont omis et que la condition est évaluée à vrai (ce qui est le cas pour le nombre 1), l'action par défaut consiste à imprimer l'enregistrement actuel.
glenn jackman