sed recherche de mots entiers et remplacement

Comment rechercher et remplacer des mots entiers par sed?

Faire

sed -i 's/[oldtext]/[newtext]/g'  

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

\ b dans les expressions régulières correspondent aux limites des mots (c.-à-d. l’emplacement entre le premier caractère de mot et le caractère non-mot):

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

Sous Mac OS X, aucune de ces syntaxes de regex ne fonctionne dans sed pour faire correspondre des mots entiers

  • \bmyWord\b
  • \

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

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

Ainsi, par exemple, remplacer la menthe par de la menthe pour des mots entiers seulement:

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

Dans l’une de mes machines, la délimitation du mot avec ” \b ” (sans les guillemets) n’a pas fonctionné. La solution consistait à utiliser ” \< " pour commencer le délimiteur et " \> " pour terminer le délimiteur.

Expliquer avec l'exemple de Joakim Lundberg :

 $ echo "bar embarassment" | sed "s/\/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/\/no bar/g" 

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

 :% s/\/new/g 
 $ echo "bar embarassment"|awk '{for(o=1;o< =NF;o++)if($o=="bar")$o="no bar"}1' no bar embarassment