Comment rechercher et remplacer des mots entiers en utilisant sed?
Faire
sed -i 's/[oldtext]/[newtext]/g' <file>
remplacera également les correspondances partielles [oldtext]
dont je ne veux pas qu'il le fasse.
\ 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
la source
sed
(et tous les autres outils GNU) via MacPorts ou Homebrew et assurez-vous qu'il vient en premier dans votrePATH
. 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à.Utiliser
\b
pour les limites de mots:la source
[]
:o,l
->[newtext],[newtext]
. Voussed -i 's/\boldtext\b/newtext/g'
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 :
la source
dans la commande shell:
ou:
mais si vous êtes dans vim, vous ne pouvez utiliser que le plus tard:
la source
la source
echo " bar embarassment " | awk '{for(o=1;o<=NF;o++)if($o=="bar")$o="no bar"}1' | cat -E
donneno bar embarassment$
.