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

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

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.


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

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

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 ''


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.