web-dev-qa-db-fra.com

sed entier recherche de mots et de remplacer

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.

107
ksuralta

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

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

Sur Mac OS X, ni de ces syntaxes regex fonctionnent à l'intérieur sed pour faire correspondre les mots entiers.

  • \bmyWord\b
  • \<myWord\>

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

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

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

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

Source: page de manuel re_format

127
Larry Gerndt

Utilisation \b pour les limites de mots:

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

Dans l’une de mes machines, délimitant le mot avec "\b "(sans les guillemets) ne fonctionnait pas. La solution consistait à utiliser" \< "pour le délimiteur de départ et" \> "pour le délimiteur final.

Pour expliquer avec l'exemple de Joakim Lundberg :

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

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
2
arganzheng