J'ai besoin de remplacer la ligne entière par sed
si elle correspond à un motif. Par exemple, si la ligne est "un deux six trois quatre" et si "six" est là, alors la ligne entière doit être remplacée par "faute".
Vous pouvez le faire avec l'un ou l'autre de ces éléments:
sed 's/.*six.*/fault/' file # check all lines
sed '/six/s/.*/fault/' file # matched lines -> then remove
Il obtient la ligne complète contenant six
et la remplace par fault
.
Exemple:
$ cat file
six
asdf
one two six
one isix
boo
$ sed 's/.*six.*/fault/' file
fault
asdf
fault
fault
boo
Il est basé sur cette solution à Remplacer la ligne entière contenant une chaîne en utilisant Sed
Plus généralement, vous pouvez utiliser une expression sed '/match/s/.*/replacement/' file
. Cela exécutera le sed 's/match/replacement/'
expression dans les lignes contenant match
. Dans votre cas, ce serait:
sed '/six/s/.*/fault/' file
Et si nous avons "un deux six huit onze trois quatre" et que nous voulons inclure "huit" et "onze" comme nos "mauvais" mots?
Dans ce cas, nous pouvons utiliser le -e
pour plusieurs conditions:
sed -e 's/.*six.*/fault/' -e 's/.*eight.*/fault/' file
etc.
Ou aussi:
sed '/eight/s/.*/XXXXX/; /eleven/s/.*/XXXX/' file
Les réponses ci-dessus ont bien fonctionné pour moi, mentionnant simplement une autre manière
Faites correspondre un motif unique et remplacez-le par un nouveau:
sed -i '/six/c fault' file
Faites correspondre plusieurs motifs et remplacez-les par un nouveau (commandes de concaténation):
sed -i -e '/one/c fault' -e '/six/c fault' file
Cela pourrait fonctionner pour vous (GNU sed):
sed -e '/six/{c\fault' -e ';d}' file
ou:
sed '/six/{c\fault'$'\n'';d}' file