Как извлечь заголовки писем из нескольких строк из файла - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь извлечь заголовок To из файла электронной почты, используя sed в linux.

Проблема заключается в том, что заголовок To может состоять из нескольких строк.

Например:

To: name1@mydomain.org, name2@mydomain.org,
    name3@mydomain.org, name4@mydomain.org, 
    name5@mydomain.org
Message-ID: <46608700.369886.1549009227948@domain.org>

Я попробовал следующее:

sed -n -e '/^[Tt]o: / { N; p; }' _message_file_ |
    awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}'

Команда sed извлекает строку, начинающуюся с To и следующую строку.Я перенаправляю вывод в awk, чтобы поместить все в одну строку.

Полная команда выводит в одной строке:

To: name1@mydomain.org, name2@mydomain.org, name3@mydomain.org, name4@mydomain.org

Я не знаю, как продолжить и проверить, еслиследующая строка начинается с пробела и добавляется к результату.

Мне нужны все адреса

To: name1@mydomain.org, name2@mydomain.org, name3@mydomain.org, name4@mydomain.org, name5@mydomain.org

Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

formail - хорошее решение, но вот как это сделать с помощью sed:

sed -e '/^$/q;/^To:/!d;n;:c;/^\s/!d;n;bc' message_file 
  • /^$/q; - (необязательно) выйти, если у нас закончатся заголовки
  • /^To:/!d; - если не заголовок To:, прекратить обработку этой строки
  • n; - в противном случае неявно распечатать его и загрузить следующую строку
  • :c; - c является меткоймы можем перейти к
  • /^\s/!d; - если не продолжение, прекратить обработку этой строки
  • n; - в противном случае неявно распечатать ее и загрузить следующую строку
  • bc - переход к метке c (т. Е. Петля)
0 голосов
/ 02 февраля 2019

Это может сработать для вас (GNU sed):

sed -n '/^To:/{:a;N;/^ /Ms/\s*\n\s*/ /;ta;P}' file

Отключите неявную печать с помощью параметра -n.Соберите строки, начинающиеся с пробела, удалив пробелы по обе стороны от новой строки и замените их одним пробелом, начиная со строки, начинающейся To:.Если сопоставление не удается, выведите первую строку в пространстве образца.

Чтобы напечатать адреса как есть, используйте:

sed '/^\S/h;G;/^To:/MP;d' file
0 голосов
/ 01 февраля 2019

Я сделал это так:

cat _message_file | formail -X To: | awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}'

Или:

formail -X To: < _message_file | awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...