1

Я пишу сценарий оболочки в моем окне Debian, и в сценарии есть строка, которая должна удалить некоторые электронные письма из текстового файла, заполненного электронными письмами, например:

sed -i '/email01@hotmail.com\|email02@gmail.com\|email03@yahoo.com/d' /myfolder/my_email_list.txt

Эта команда работает, но так как этот список становится довольно большим, я подумал, есть ли способ сохранить все электронные письма, которые я хочу, чтобы sed удалил в список (текстовый файл), потому что когда мне нужно новое электронное письмо для добавил, я бы просто отредактировал список вместо того, чтобы редактировать скрипт и включать его в выражение.

Можно ли что-то подобное сделать?

1 ответ1

0

Вполне может быть способ сделать это изначально в sed но вот некоторые другие варианты:

  1. grep

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

    Здесь вы даете grep список шаблонов -f для поиска, говоря это , чтобы рассматривать их как простые строки -F и просить те линии , которые не -v соответствуют ни одному из них. Наконец, вы перенаправляете вывод во временный файл, а затем переименовываете файл, чтобы перезаписать оригинал.

  2. Perl

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

    Это открывает badmails.txt , сохраняет каждую строку как ключ к хешу , затем проходит через каждую строку my_email_list.txt (while(<>){}) и печатает ее, если в badmails.txt не присутствует та же самая строка (электронная почта) , то есть, если соответствующее значение не определено в хэше (print unless defined($k{$_}))

  3. sed и shell:

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

    или используйте оболочку для создания списка писем, которые вы хотите удалить, например, me@mine.com\|you@yours.net и передайте его в sed:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .