bash: редактирование заголовков письма (поступающего не stdin)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

bash: редактирование заголовков письма

Сообщение t.t »

Никак не могу найти красивого решения. Есть текст письма со всеми заголовками, поступающий на стандартный ввод. Нужно отредактировать тему письма и выдать результат на стандартный вывод. Если бы заголовки хранились в переменной, это выглядело бы так:

Shell

s="$(reformime -h "$(echo "$headers" | formail -x Subject)" | sed 's/чего-то/куда-то/')" echo "$headers" | formail -I "Subject: $s"

Но заголовков может быть много, и в командную строку они могут не поместиться.

Временный файл использовать не хотелось бы, т.к. запуск планируется из ~/.procmailrc, а писем теоретически может быть много (десятки или сотни), и если это "много" совпадёт по времени с другой дисковой активностью... одним словом, не хотелось бы.

Какие ещё есть варианты?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: bash: редактирование заголовков письма

Сообщение drBatty »

t.t писал(а):
29.04.2009 16:25
Никак не могу найти красивого решения. Есть текст письма со всеми заголовками, поступающий на стандартный ввод. Нужно отредактировать тему письма и выдать результат на стандартный вывод.
не понимаю, почему нельзя просто через sed пропустить?
sed ведь может и нужные строки найти, и заменить в них что надо, и для некоторых строк выполнить какую-нибудь команду...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: редактирование заголовков письма

Сообщение t.t »

drBatty писал(а):
29.04.2009 18:53
не понимаю, почему нельзя просто через sed пропустить?
sed ведь может и нужные строки найти, и заменить в них что надо, и для некоторых строк выполнить какую-нибудь команду...
Дело в том, что прежде чем отдавать тему sed-у, её нужно декодировать. Для примера:

Shell

$ formail -x Subject <PocketBook-old =?utf-8?b?UG9ja2V0Qm9vayA6OiBSRTogUG9ja2V0Qm9vayAyMDEuIDUg0LTRjtC50Lw=?= =?utf-8?b?0L7Qsi4=?=


reformail, который гарантировано понимает такие заголовки, принимает их только из командной строки; как фильтр он в таком режиме не работает. Но даже не в этом проблема. Проблема в том, что любому перекодировщику нужно отдать (и получить, соответственно), только содержимое поля Subject (даже без заголовка) -- а после него отдать на выход все заголовки, причём желательно в том же порядке, в котором они шли в оригинальном письме.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: bash: редактирование заголовков письма

Сообщение watashiwa_daredeska »

Я бы таки не парился и сделал временный файл, а проблему с "другой дисковой активностью" решил бы с помощью tmpfs.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: редактирование заголовков письма

Сообщение t.t »

watashiwa_daredeska писал(а):
29.04.2009 20:02
Я бы таки не парился и сделал временный файл, а проблему с "другой дисковой активностью" решил бы с помощью tmpfs.
Да я уже тоже близок к мысли, что другие варианты слишком уж сложные. Заодно будет повод убрать с диска /tmp, что я уже много месяцев никак не соберусь сделать.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: bash: редактирование заголовков письма

Сообщение pcodr »

Декодировать заголовок можно и как-нибудь так

Код: Выделить всё

echo "=?utf-8?b?UG9ja2V0Qm9vayA6OiBSRTogUG9ja2V0Qm9vayAyMDEuIDUg0LTRjtC50Lw=?=" | sed -r 's/^=\?[^?]+\?b\?//' | sed 's/?=$//' | base64 -d
remote system type is unix
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: редактирование заголовков письма

Сообщение t.t »

pcodr писал(а):
29.04.2009 21:20
Декодировать заголовок можно и как-нибудь так

Код: Выделить всё

echo "=?utf-8?b?UG9ja2V0Qm9vayA6OiBSRTogUG9ja2V0Qm9vayAyMDEuIDUg0LTRjtC50Lw=?=" | sed -r 's/^=\?[^?]+\?b\?//' | sed 's/?=$//' | base64 -d
А то я не пробовал?.. base64 часто обрезает хвосты; вот не знаю почему, не разобрался -- но обрезает. Кроме того, в таком варианте придётся вручную обрабатывать многострочные заголовки (в моём примере выше -- двустрочный). Ну и главное: это всё равно не решает проблему: base64 на вход точно так же нужно отдавать только содержимое поля Subject, да ещё и предварительно обработанное, а не все заголовки.

Я уже сделал с временным файлом.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: bash: редактирование заголовков письма

Сообщение drBatty »

t.t писал(а):
29.04.2009 19:30
reformail, который гарантировано понимает такие заголовки, принимает их только из командной строки; как фильтр он в таком режиме не работает. Но даже не в этом проблема. Проблема в том, что любому перекодировщику нужно отдать (и получить, соответственно), только содержимое поля Subject (даже без заголовка) -- а после него отдать на выход все заголовки, причём желательно в том же порядке, в котором они шли в оригинальном письме.
ну и я про то:
перекодировщик ведь из потока берёт? вот и меняем строку с заголовком командой sed
s/.../.../e
она будет вызывать ваш перекодировщик.
вот одна команда sed, которая просматривает лог загрузки, выделяет строки про загруженный файл, приводит имя файла в понятный для shell формат, затем запускает команду file для каждого этого файла, а потом раскрашивает результат работы. В вашем случае конечно проще намного будет :)

$

cat logfile | sed -rn '/Загрузка завершена:.+South Park/!b s/.+Загрузка завершена: /: / s/[] ()[]/\\&/2g s/: /: \/home\/amule\/.aMule\/Incoming\// s/:/file/ep'|sed -r ' s/\/home\/amule\/.aMule\/Incoming\/// s/^([^:]+): /\x1b[32m\1\x1b[0m:\n/ s/, video:/\nvideo:/ s/, audio:/\naudio:/ '

ed2kForAll.South Park - 02xAll - Season 2 (TVRip, Rus-Goblin).avi.emulecollection:
ASCII text, with CRLF line terminators
South Park 1x01 Cartman Gets an Anal Probe [rus] Южный парк 1x01.avi:
RIFF (little-endian) data, AVI, 512 x 384, 25.00 fps
video: DivX 5
audio: MPEG-1 Layer 3 (mono, 44100 Hz)
ed2kForAll.South Park - 01xAll - Season 1 (TVRip, Rus-Goblin).avi.emulecollection:
data
South Park 10x10 Miss Teacher Bangs a Boy [rus] Южный парк 10x10.avi:
RIFF (little-endian) data, AVI, 576 x 416, 23.98 fps
video: XviD
audio: MPEG-1 Layer 3 (mono, 44100 Hz)
South Park - Imaginationland [rus] Южный парк - Воображляндия (2008) [полнометражный].avi:
RIFF (little-endian) data, AVI, 720 x 400, 23.98 fps
video: DivX 5
audio: MPEG-1 Layer 3 (stereo, 48000 Hz)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: bash: редактирование заголовков письма

Сообщение drBatty »

t.t писал(а):
29.04.2009 22:43
Я уже сделал с временным файлом.

я тоже делал... потом понял, что если строки гарантированно небольшие(меньше 1000), и их 1-5, то проще это всё сделать через sed. да и быстрее, она имхо как раз для того и придумана. правда несколько строк сразу не получается, приходится их в hold space пихать, да и то, если их точно не много...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: редактирование заголовков письма

Сообщение t.t »

drBatty писал(а):
30.04.2009 01:42
t.t писал(а):
29.04.2009 22:43
Я уже сделал с временным файлом.
я тоже делал... потом понял, что если строки гарантированно небольшие(меньше 1000), и их 1-5, то проще это всё сделать через sed. да и быстрее, она имхо как раз для того и придумана. правда несколько строк сразу не получается, приходится их в hold space пихать, да и то, если их точно не много...
Да вот то-то и оно-то. Я уже дважды говорил о многострочных заголовках. Не думаю, что обработка таких заголовков на sed будет достаточно простой, особенно учитывая вероятность битых заголовков, с которыми formail и reformime худо-бедно справляются.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: