Use sed para encontrar a palavra inteira e substituir

Use sed para encontrar a palavra inteira e substituir

Eu tenho o seguinte bloco de texto em um arquivo:

test3.legacy test4.legacy test3 test3.kami

Quero apenas pesquisar test3como um todo e substituí-lo por nada. Infelizmente, todas as minhas tentativas removeramteste3de test3.legacye test3.kami. Eu tentei:

sed 's/^test3://g' myfile.txt
sed 's/\btest3\b//g' myfile.txt
sed 's/\<test3\>//g' myfile.txt

sem sorte. Alguma idéia de como posso resolver isso, por favor?

EDITAR:A maioria das tentativas resultou no seguinte:.legacy test4.legacy .kami

Responder1

É isso que voce quer?

$ sed 's/\(^\| \)test3\( \|$\)/\1/g' file
test3.legacy test4.legacy test3.kami

Isto diz

substitute
   (^ start of line OR space)
   test3
   (space OR end of line)
with match 1 (AKA space or start of line)

Atualizar:

E como tão elegantemente colocado pelo bom@Stephane Chazelasisso não resolveria certos casos. Enfatize também a parte da portabilidade. Verresponda abaixo.

Uma variante GNU poderia,(esperançosamente), ser:

sed 's/\(^\| \)\(test3\( \|$\)\)*/\1/g'
# Or perhaps:
sed 's/\(^\| \)\(test3\( \|$\)\)\+/\1/g'

cuidando de partidas repetitivas. Opcionalmente, alguém também cuidaria de vários espaços, etc. Dependendo da entrada.

EOUPD


Como alternativa, talvez (apenas como ponto de partida):

sed 's/\Wtest3\W/ /g'

Não é isso que presumo:

$ sed 's/test3\.\?[^ ]* *//g' file
test4.legacy

Responder2

Eu procuraria test3 embrulhado com um espaço em ambos os lados, \sdado o seu exemplo, em vez de tentar usar a notação de limite de palavras.

Por exemplo

$ echo "test3.legacy test4.legacy test3 test3.kami" | sed 's/\stest3\s/ /g'
test3.legacy test4.legacy test3.kami

O acima procuraespaçoteste3espaçoe substitui isso por apenas umespaço.

OBSERVAÇÃO:Isso não resolverá a situação em que test3 está em primeiro lugar na lista!

Responder3

Portavelmente:

sed -e 's/.*/ & /' -e :1 -e 's/ test3 / /g;t1' -e 's/^ //;s/ $//'

Aquilo é:

  • primeiro adicione um espaço no início e no final da linha, para não ter que considerar test3especialmente no início e no final,
  • substituir test3espaços fechados por um único espaço,
  • repetir o processo enquanto houver substituições (para cobrir os test3 test3casos).
  • Remova o espaço inicial e final que adicionamos inicialmente.

Responder4

sed -e 's/ test3 / /g' -e 's/ test3//g' -e 's/test3 //g' myfile.txt

Por favor, tente acima

informação relacionada