sed pesquisa palavra inteira e substituir
Pergunta
Como faço para procurar e substituir palavras inteiras usando sed?
Fazendo
sed -i 's/[oldtext]/[newtext]/g' <file>
também irá substituir partidas parciais de [oldtext]
que eu não quero que ele faça.
Solução
\ b em expressões regulares coincidir com limites de palavra (ou seja, a localização entre o primeiro caractere de palavra e caráter não-palavra):
$ echo "bar embarassment" | sed "s/\bbar\b/no bar/g"
no bar embarassment
Outras dicas
No Mac OS X, não destes regex sintaxes interior trabalho sed para combinar palavras inteiras
-
\bmyWord\b
-
\<myWord\>
Ouça-me agora e acredita-me mais tarde, este sintaxe feio é o que você precisa para uso:
-
/[[:<:]]myWord[[:>:]]/
Assim, por exemplo, para substituir hortelã com mentolado apenas por palavras completas:
-
sed "s/[[:<:]]mint[[:>:]]/minty/g"
Fonte: re_format página man
Use \b
para limites de palavra:
sed -i 's/\boldtext\b/newtext/g' <file>
Em uma de minha máquina, delimitando a palavra com "\b
" (sem as aspas) não funcionou. A solução foi usar "\<
" para iniciar delimitador e "\>
" para acabar com delimitador.
Para explicar com Joakim Lundberg de exemplo:
$ 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ê está 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