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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top