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
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' -i
option
sed -i '/^all:/ s/$/ anotherthing/' file
Ou vous pouvez le rediriger 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 (substitut), vous pouvez rechercher une ligne qui satisfait une expression régulière. Dans la commande ci-dessus,
&
représente la chaîne correspondante.la source
Vous pouvez ajouter 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é parpatt
, alors effectuez les actions décrites dans{}
./^all:/ {$0=$0" anotherthing"}
si la ligne commence (représentée par^
) parall:
, alors ajoutezanotherthing
à la ligne.1
comme condition vraie, déclenche l'action par défaut deawk
: 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:
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
la source
awk: can't set $0
/usr/xpg4/bin/awk
quel est le "bon" awk.Dans bash:
while read -r line ; do [[ $line == all:* ]] && line+=" anotherthing" echo "$line" done < filename
la source
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 ''
la source
Solution avec awk:
awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file
Simplement: si la ligne commence par
all
imprimer la ligne plus "autre chose", sinon n'imprimez que la ligne.la source
awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
condition {actions}
paires. Si lecondition
est 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 nombre1
), l'action par défaut consiste à imprimer l'enregistrement actuel.