Réponses:
\ b dans les expressions régulières correspond aux limites des mots (c'est-à-dire 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
\band\b
sauvé la journée :)
Sur Mac OS X, aucune de ces syntaxes regex ne fonctionne dans sed pour faire correspondre des mots entiers
\bmyWord\b
\<myWord\>
Écoutez-moi maintenant et croyez-moi plus tard, cette vilaine syntaxe est ce que vous devez utiliser:
/[[:<:]]myWord[[:>:]]/
Ainsi, par exemple, pour remplacer menthe par menthe pour les mots entiers uniquement:
sed "s/[[:<:]]mint[[:>:]]/minty/g"
Source: page de manuel re_format
sed
(et tous les autres outils GNU) via MacPorts ou Homebrew et assurez-vous qu'il vient en premier dans votre PATH
. Il est possible de rendre un Mac assez utilisable.
brew install coreutils
, qui préfixe tous les outils gnu.
brew install gnu-sed
à utilisergsed
perl -pe 's|\bone\b|two|g'
. Fonctionne de manière stable tandis que sed échoue ici et là.
Dans l'une de mes machines, délimiter le mot par " \b
" (sans les guillemets) ne fonctionnait pas. La solution consistait à utiliser " \<
" pour commencer le délimiteur et "\>
" pour le délimiteur de fin.
Pour 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 plus tard:
:% s/\<old\>/new/g
$ echo "bar embarassment"|awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1'
no bar embarassment
echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -E
donne no bar embarassment$
.