Use sed para encontrar a palavra inteira e substitua

6

Eu tenho o seguinte bloco de texto em um arquivo:

test3.legacy test4.legacy test3 test3.kami

Eu só quero pesquisar test3 como um todo e substituí-lo por nada. Infelizmente, todas as minhas tentativas removeram o test3 de 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 eu posso resolver isso, por favor?

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

    
por maGz 05.05.2013 / 21:20

5 respostas

6

É isso que você quer?

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

Isso diz

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

Atualização:

E como tão bem colocado pelos bons @Stephane Chazelas isso não cuidaria de certos casos . Também enfatize a parte da portabilidade. Veja resposta abaixo .

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

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

cuidando de correspondências repetitivas. Opcionalmente, um cuidaria de múltiplos espaços etc também. Dependendo da entrada.

EOUPD

Como uma alternativa talvez ( significa apenas como um ponto de partida ):

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

Não é isso que eu assumo:

$ sed 's/test3\.\?[^ ]* *//g' file
test4.legacy
    
por 05.05.2013 / 21:27
3

Eu procuraria o test3 empacotado com um espaço em ambos os lados, \s , dado 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 texto acima procura espaço test3 espaço e substitui isso por apenas um espaço .

NOTA: Isto não irá lidar com a situação em que o test3 é o primeiro da lista!

    
por 05.05.2013 / 21:32
3

Portável:

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

Isto é:

  • primeiro adicione um espaço no início e no final da linha, para não ter que considerar test3 no início e no final especialmente,
  • substitua test3 entre espaços com um único espaço,
  • repita o processo, desde que haja substituições (para cobrir os test3 test3 casos).
  • Remova o espaço inicial e final que adicionamos inicialmente.
por 05.05.2013 / 21:59
-1

Isso também funcionou para mim, apenas removendo a palavra test3

sed 's/ test3 .//g' 
    
por 15.03.2015 / 14:36
-1
sed -e 's/ test3 / /g' -e 's/ test3//g' -e 's/test3 //g' myfile.txt

Por favor, tente acima

    
por 09.07.2015 / 01:34