É possível sed -i de um arquivo de texto para outro arquivo de texto?

1

Estou codificando um script shell na minha caixa Debian e há uma linha no script que precisa excluir alguns e-mails de um arquivo de texto cheio de e-mails, como este:

sed -i '/[email protected]\|[email protected]\|[email protected]/d' /myfolder/my_email_list.txt

Este comando funciona, mas como esta lista está ficando bem grande, eu estava pensando se há uma maneira de armazenar todos os emails que eu quero que o sed delete em uma lista (arquivo texto), porque quando eu preciso de um novo E-mail para ser adicionado, gostaria apenas de editar a lista em vez de editar o script e incluí-lo na expressão.

É algo assim capaz de ser feito?

    
por gtbono 06.02.2014 / 14:20

1 resposta

0

Pode haver uma maneira de fazer isso nativamente em sed , mas aqui estão algumas outras opções:

  1. grep

    grep -vFf badmails.txt my_email_list.txt > tempfile && 
      mv tempfile my_email_list.txt
    

    Aqui, você está dando a grep uma lista de padrões ( -f ) para pesquisar, dizendo para tratá-los como strings simples ( -F ) e perguntando por aquelas linhas que não ( -v ) corresponde a qualquer um deles. Finalmente, você redireciona a saída para um arquivo temporário e renomeia o arquivo para substituir o original.

  2. Perl

    perl -i -e 'open($f,"badmails.txt"); map{$k{$_}++}<$f>; 
                while(<>){print unless defined($k{$_})}' my_email_list.txt 
    

    Isso abre badmails.txt , salva cada linha como a chave para um hash e é executada por cada linha de my_email_list.txt ( while(<>){} ) e imprime a mesma, a menos que a mesma linha (email) estivesse presente em badmails.txt , ou seja, a menos que o valor correspondente seja definido no hash ( print unless defined($k{$_}) )

  3. sed e shell:

    while read badmail; do 
      sed -i sed -i "/$badmail/d" my_email_list.txt ;
    done < badmails.txt 
    

    ou use o shell para criar a lista de e-mails que você deseja excluir, por exemplo, [email protected]\|[email protected] e passa isso para sed :

    bad=$(while read b; do printf "%s\|" "$b"; done < badmails.txt|
          sed 's/\|$//')
    sed -i "/$bad/d" my_email_list.txt 
    
por 06.02.2014 / 14:51