@Voron095
Системный администратор, аналитик, архитектор...

Регулярка для egrep

Добрый день. Помогите дописать регулярку для bash скрипта.

Имеем на входе в egrep

From: =?utf-8?B?aGVscAo=?= <help@mail.mail>
Subject: =?utf-8?B?0J/RgNC40LLQtdGCINGF0LDQsdGALCDQvdGD0LbQvdCwINC/0L7QvNC+0YjRjCD=
=?utf-8?B?Qv9C+INGA0LDQsdC+0YLQtSDRgSBlZ3JlcC4g0JrQsNC6INC30LDRgdGC0LDQst=
=?utf-8?B?C40YLRjCBlZ3JlcCwg0LfQsNGF0LLQsNGC0YvQstCw0YLRjCDQstGB0LUg0YHRg=
To: =?utf-8?B?aGVscAo=?= <help@mail.mail>

на выходе нужно получить:

Subject: =?utf-8?B?0J/RgNC40LLQtdGCINGF0LDQsdGALCDQvdGD0LbQvdCwINC/0L7QvNC+0YjRjCD=
=?utf-8?B?Qv9C+INGA0LDQsdC+0YLQtSDRgSBlZ3JlcC4g0JrQsNC6INC30LDRgdGC0LDQst=
=?utf-8?B?C40YLRjCBlZ3JlcCwg0LfQsNGF0LLQsNGC0YvQstCw0YLRjCDQstGB0LUg0YHRg=

egrep -io '^Subject:(\s*=\?(utf-8|windows-1251|koi-8r)\?(B|Q)\?[A-Za-z0-9=\+]+\?=)+' возвращает только первую строку.
Как быть?
  • Вопрос задан
  • 3033 просмотра
Решения вопроса 1
@rakeev
Grep вообще-то построчным сравнением занимается. Установите pcregrep.
НУ или если непременно только грепом нужно обойтись, то можно ключ -P заюзать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@dpirat
(Subject:)(.)*(\W)*(.)*(\W)*(.)*

Протестировал тут: rubular.com. (http://rubular.com/r/wlhqJwbex6)
Надеюсь поможет.
Ответ написан
AterCattus
@AterCattus
Люблю быстрый backend
А можно на awk для заголовков в любое число строк:
awk -F ':' 'BEGIN{key=""} {if ($2) {key=$1}; h[key][length(h[key])+1]=$0}END{for (i in h["Subject"]) print h["Subject"][i]}' /path/to/file

Строим словарь вида «From» => [строки], «Subject» => [строки], ..., а потом выводим строки по нужному ключу.
Ответ написан
Комментировать
shambler81
@shambler81 Куратор тега Linux
тут все просто
раздели их на блоки
1 блок все что начинается с
2 блок все что начинается с To:

(1блок)(2блок) вернуть только $1
В результате твоя регулярка сократиться до пары символов
(^Subject:.*)(To:) вернуть $2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы