mot entier recherche et remplacer
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.
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