Como posso fazer com que “sed” seja específico ao procurar por uma frase?

1

Estou usando "sed" para encontrar e excluir uma frase em um arquivo de texto. Funciona muito bem, mas não consigo fazer com que seja específico. Por exemplo, este é o meu comando "sed":

sed -i 's/foobox.com//' ~/Foo/fooman.txt

Estou procurando 6 frases específicas em ~ / Foo / fooman.txt

eles são:

dl-web.foobox.com
dl.foobox.com
foobox.com
fooboxdownloads.com
www.foobox.com
www.fooboxdownloads.com

Quando executo sed -i 's/foobox.com//' ~/Foo/fooman.txt , ele encontra todos os itens com "foobox.com" e o exclui, mas deixa os excessos lá (ou seja, "dl-web". "dl" "downloads.com" "www." "www.downloads.com".

Posso fazer com que "sed" use um "curinga" ao pesquisar a frase? Se assim for, onde colocar o curinga (eu já tentei (*) que não funciona). Se não estiver usando um curinga, o "sed" pode usar algum outro método para ser específico (dl-web.foobox.com) em vez de ser apenas geral (foobox.com)? id "sed" não pode fazer o truque, existe algum comando de CI que funcione?

Obrigado por qualquer ajuda, sou novo no Linux e escrevo comandos de IC.

    
por user18432 21.05.2012 / 17:44

3 respostas

1

depende de como as strings são delimitadas

Digamos que você esteja delimitado por espaços e algo assim pode funcionar:

sed 's/ .*foobox.*\.com / /g'

O 'g' garantirá que, se houver mais de uma correspondência em uma linha, todas as correspondências serão substituídas

testado com

DEF  dl-web.foobox.com XYZ
DEF dl.foobox.com XYZ
DEF  foobox.com XYZ
DEF  fooboxdownloads.com XYZ
DEF  www.foobox.com XYZ
DEF  www.fooboxdownloads.com XYZ 

produzindo

DEF XYZ
DEF XYZ
DEF XYZ
DEF XYZ
DEF XYZ
DEF XYZ 
    
por Thorsen 28.06.2012 / 20:49
1

[[:alnum:].-] corresponderá a um caractere alfabético ou numérico ou a . ou - . Coloque um * após ele e ele corresponderá a zero ou mais disso (avidamente). Isso provavelmente deve cobrir os possíveis caracteres em um hostname. Observe também que . corresponde a qualquer caractere, portanto, se você quiser corresponder apenas a . , será necessário escapar com \ ou incluí-lo em [ e ] (ou seja: \. ou [.] ). Então:

sed -i 's/[[:alnum:].-]*foobox\.com[[:alnum:].-]*//g' file

pode ser o que você deseja. Note que a opção não-padrão -i do GNU e do BSD sed não edita arquivos, substitui os arquivos. Pode não importar no seu caso, apenas esteja ciente de que se algum dos arquivos for links, esses links serão quebrados. Se isso importa, considere usar um editor de arquivos baseado em comando, como ed ou ex .

Veja o link para uma boa introdução ao sed.

    
por geirha 28.06.2012 / 21:14
0

Você poderia usar o grep? O comando

cat ~/Foo/fooman.txt | grep -v foobox.com

removerá todas as linhas que contiverem a frase foobox.com. É isso que você queria fazer?

    
por theabro 21.05.2012 / 18:06