Como deletar uma string variável no arquivo

2

Na verdade, estou usando

sed -e s/Perro-A//g -i *-a.log 

para excluir a string Perro-A de muitos arquivos terminados com * -a.log.

Mas às vezes nos arquivos eu posso não ter Perro-A; Eu posso ter cordas como Perro-B, Perro-C, Perro-14, Perro-X, Perro-DHFN, etc.

Eu preciso atualizar o comando anterior para excluir qualquer sequência começando com "Perro". Como posso conseguir isso?

    
por alloppp 09.06.2016 / 13:12

3 respostas

3

Supondo que você só queria excluir todas as cadeias começando com "Perro", você pode usar:

sed 's/Perro[^ ]*//g' *-a.log

Se você quiser editar o arquivo, use a opção -i com sed , como

sed -i sed 's/Perro[^ ]*//g' *-a.log

Atualizar

Se você não quiser ter vários espaços, poderá usar:

sed -i sed 's/Perro[^ ]*//g' *-a.log | tr -s " "

dados de amostra,

rahul@rahul: cat a.log
Foo Perro-B Perro-C Bar
Perro-14 cmd  Perro-X
Perro-DHFN abc xyz
aBcD Perro-14

rahul@rahul: sed 's/Perro[^ ]*//g' a.log | tr -s " "
Foo Bar
 cmd
 abc xyz
aBcD
    
por 09.06.2016 / 13:23
0

Se você quiser remover a palavra Perro- * para o próximo espaço em branco, por exemplo, você pode usar:

sed -ie 's/Perro-.*\s//g' *-a.log

Amostra:

cat /tmp/foo
Prefix Perro-A Suffix
Pre Perro-B Suf

sed -ie 's/Perro-.*\s//g' /tmp/foo

cat /tmp/foo
Prefix Suffix
Pre Suf

Observe que o sed não manipula a filtragem não desejada.

Outra maneira é usar perl para o trabalho:

cat /tmp/foo
Prefix Perro-A c Perro-B Suffix
Perro-C Pre Suf Perro-D

perl -i -pe 's/Perro-.*?\s//g' /tmp/foo

cat /tmp/foo
Prefix c Suffix
Pre Suf
    
por 09.06.2016 / 13:37
0

Você está apenas a alguns caracteres da sua própria resposta:

sed -i -e 's/Perro.*//g' *-a.log

(Mudei o -i antes apenas para tornar óbvio ao leitor que estamos fazendo edições no local). Isso excluirá qualquer string que contenha a string "Perro", seguida por qualquer (ou não) quantidade de caracteres ( .* ).

Se, ao invés disso, você quiser remover strings que iniciam com "Perro", você só precisa ancorar a string com ^ :

sed -i -e 's/^Perro.*//g' *-a.log

Lambert faz um bom ponto de esclarecimento nos comentários aqui; as instruções sed acima removem as strings da linha, mas mantêm a linha (possivelmente em branco agora). Se, em vez disso, você quiser que o sed exclua a linha se ela contiver Perro, ele terá a sintaxe correta:

sed -i -e '/Perro/d' *-a.log

... ou similarmente, exclua a linha se iniciar com o Perro:

sed -i -e '/^Perro/d' *-a.log
    
por 09.06.2016 / 13:18