Respostas:
\ b em expressões regulares correspondem aos limites da palavra (ou seja, a localização entre o caractere da primeira palavra e o caractere não verbal):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
\band\b
salvei o dia :)
No Mac OS X, nenhuma dessas sintaxes regex funciona dentro do sed para combinar palavras inteiras
\bmyWord\b
\<myWord\>
Ouça-me agora e acredite em mim mais tarde, esta sintaxe feia é o que você precisa usar:
/[[:<:]]myWord[[:>:]]/
Assim, por exemplo, para substituir hortelã por mentolado apenas para palavras inteiras:
sed "s/[[:<:]]mint[[:>:]]/minty/g"
Fonte: página do manual re_format
sed
(e todas as outras ferramentas GNU) através do MacPorts ou Homebrew e certifique-se de que ele vem primeiro no seu PATH
. É possível tornar um Mac razoavelmente utilizável.
brew install coreutils
, que prefixa todas as ferramentas gnu.
brew install gnu-sed
para usargsed
perl -pe 's|\bone\b|two|g'
. Funciona de forma estável enquanto o sed falha aqui e ali.
Use \b
para limites de palavras:
sed -i 's/\boldtext\b/newtext/g' <file>
[]
: o,l
-> [newtext],[newtext]
. Você obviamente quis dizer sed -i 's/\boldtext\b/newtext/g'
Em uma das minhas máquinas, delimitar a palavra com " \b
" (sem as aspas) não funcionou. A solução foi usar " \<
" para iniciar o delimitador e "\>
" para delimitador final.
Para explicar com o exemplo de Joakim Lundberg :
$ echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
no bar embarassment
no comando shell:
echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
ou:
echo "bar embarassment" | sed "s/\<bar\>/no bar/g"
mas se você estiver no vim, você só pode usar o mais tarde:
:% 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
dá no bar embarassment$
.