web-dev-qa-db-fra.com

Remplacer toute la ligne quand une correspondance a été trouvée avec sed

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".

38
irek

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
60
fedorqui

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
5
Hasan Rumman

Cela pourrait fonctionner pour vous (GNU sed):

sed -e '/six/{c\fault' -e ';d}' file

ou:

sed '/six/{c\fault'$'\n'';d}' file
3
potong