Question

Comment rechercher et remplacer des mots entiers avec sed?

Faire

sed -i 's/[oldtext]/[newtext]/g' <file> 

remplacera également les correspondances partielles de [oldtext] ce que je ne veux pas que ce soit fait.

Était-ce utile?

La solution

\ b dans les expressions régulières correspondent aux limites des mots (c'est-à-dire l'emplacement entre le premier caractère du mot et le caractère autre que le mot):

$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment

Autres conseils

Sous Mac OS X, aucune de ces syntaxes regex ne fonctionne à l'intérieur de sed pour faire correspondre les mots entiers

  • \bmyWord\b
  • \<myWord\>

Écoutez-moi maintenant et croyez-moi plus tard, cette syntaxe laide est ce que vous devez utiliser:

  • /[[:<:]]myWord[[:>:]]/

Ainsi, par exemple, pour remplacer menthe par menthe uniquement pour les mots entiers:

  • sed "s/[[:<:]]mint[[:>:]]/minty/g"

Source: page de manuel re_format

Utilisez \b pour les limites de mots:

sed -i 's/\boldtext\b/newtext/g' <file>

Dans l’une de mes machines, délimitez le mot avec " \b " (sans les guillemets) n'a pas fonctionné. La solution consistait à utiliser & Quot; \< & Quot; pour le délimiteur de départ et " \> " pour terminer le délimiteur.

Expliquer avec l'exemple de Joakim Lundberg :

$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment

dans la commande shell:

echo "bar embarassment" | sed "s/\bbar\b/no bar/g" 

ou:

echo "bar embarassment" | sed "s/\<bar\>/no bar/g"

mais si vous êtes dans vim, vous ne pouvez utiliser que le dernier:

:% s/\<old\>/new/g
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top