Como faço para obter uma lista e removê-la de um arquivo?

10

Eu tenho uma longa lista de nomes de domínio que eu preciso remover do / etc / remotedomains. Eles provavelmente não estão em nenhuma ordem específica no arquivo. Cada domínio está em uma linha.

Como eu poderia percorrer a lista e encontrar essa linha em domínios remotos e removê-la.

    
por xenoterracide 24.10.2010 / 05:24

3 respostas

10
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains

O -v diz ao grep para apenas as linhas de saída que não correspondem ao padrão.

O -f list diz ao grep para ler os padrões do arquivo list .

O -F diz ao grep para interpretar os padrões como strings simples, não como expressões regulares (assim você não terá problemas com meta-caracteres regex).

O -x diz ao grep para corresponder à linha inteira, por ex. se houver um padrão foo que só deve remover a linha foo , não a linha foobar ou barfoo .

    
por 24.10.2010 / 05:29
1

Use a comunicação!

comm -23 /etc/remotedomains remove

Da página do manual:

Compare sorted files FILE1 and FILE2 line by line.

With no options, produce three-column output. Column one contains lines unique to FILE1, column two contains lines unique to FILE2, and column three contains lines common to both files.

As opções -1, -2 e -3 desativam as respectivas colunas.

No entanto, exige que os arquivos sejam classificados.

    
por 18.09.2014 / 10:47
0

sed -r -i -e '/^(domain1|domain2|domain3|...|domainN)$/d' domainlist.txt

Se a sua lista de domínios a excluir estiver em um arquivo, então:

sed -r -i -e '/^'"$(xargs <removelist.txt|sed -e 's/ /|/g)"')$/d' domainlist.txt

Notas:

  1. Use -i.bak para fazer o sed fazer um backup do domainlist.txt

  2. Se removelist.txt tiver muitos milhares de entradas, ele poderá estourar o comprimento máximo da linha de comando. Este não é um cenário muito provável, mas algo que você deve estar ciente.

Em uma reflexão mais aprofundada, esse risco pode ser eliminado com:

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
    
por 29.07.2012 / 11:53