![Use sed para encontrar a palavra inteira e substituir](https://rvso.com/image/31683/Use%20sed%20para%20encontrar%20a%20palavra%20inteira%20e%20substituir.png)
Eu tenho o seguinte bloco de texto em um arquivo:
test3.legacy test4.legacy test3 test3.kami
Quero apenas pesquisar test3
como um todo e substituí-lo por nada. Infelizmente, todas as minhas tentativas removeramteste3de test3.legacy
e 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, \s
dado 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
test3
especialmente no início e no final, - substituir
test3
espaços fechados por um único espaço, - repetir o processo enquanto houver substituições (para cobrir os
test3 test3
casos). - 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