ti-enxame.com

Como faço uma lista e remova-a de um arquivo?

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

Como posso iterar a lista e encontrar essa linha em domínios remotos e removê-lo.

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

O -v conta grep apenas em linhas de saída que não correspondem ao padrão.

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

O -F conta o grep interpretar os padrões como seqüências simples, não expressões regulares (então você não terá problemas com os Meta-Personagens de Regex).

O -x conta o grep para combinar toda a linha, e. Se houver um padrão foo que só deve remover a linha foo, não a linha foobar ou barfoo.

11
sepp2k

Use Comm!

comm -23 /etc/remotedomains remove

Da página do homem:

Compare arquivos classificados arquivo1 e file2 linha por linha.

Sem opções, produza saída de três colunas. A coluna One contém linhas exclusivas para o arquivo1, a coluna dois contém linhas exclusivas para o arquivo2 e a coluna três contém linhas comuns para os dois arquivos.

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

No entanto, exige que os arquivos sejam classificados.

1
jgr

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

Se sua lista de domínios para 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 ter sed fazer um backup do DomioList.txt

  2. Se o removelist.txt tiver muitos milhares de entradas, ele pode transbordar 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 mais reflexão, 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
0
cas