Я просто поставил свое решение с помощью sed
, даже если его просят специально для AWK, я считаю это решение более компактным и прямым:
GNU Sed (проверено в CentOS):
sed -n '1!p' addresses.csv | sed -r 's!^([0-9]*(\sbis|\ster)?),?(.*)$!\1,\3!g;s!(.*)([^,])(,[0-9]*)$!\1\2,\3!g'
OS-X / BSD Sed
sed -n '1!p' addresses.csv | sed -E 's!^([0-9]*( bis| ter)?),?(.*)$!\1,\3!g;s!(.*)([^,])(,[0-9]*)$!\1\2,\3!g'
Первая команда sed берет все строки, кроме первой (заголовок).
Для второго sed
я использую замены:
^ : Starting text.
[0-9]* : all numbers (0, 1, ... 99, 999, 99999999 and so on)
( bis| ter)? : optionally followed by " bis" or " ter" (notice the space before); group 2
,? : optionally followed by a comma
(.*)$ : the rest of the string until the end ($) (group 3)
!\1,\3 : replaced by first group (number + extension) - comma - third group
Обратите внимание, что вторая группа - это скобки для 'bis' и 'ter', а первая группа - это ([0-9 ] * (bis | ter) {0,1})
Вторая замена предназначена для нормализации запятых (если она не заканчивается ,, \ d
, мы добавляем дополнительную запятую.
Может быть, самый простой способ — это использовать конвейер к сценарию/бинарному файлу, который будет выполнять произвольные преобразования:
begin routers
pass2script:
driver = accept
transport = myscript
condition = ## every distinction you need ##
И транспорт:
begin transports
myscript:
driver = pipe
command = /path/to/script
Все сообщение, включая заголовки, пустую строку и тело, будет передано в stdin
скрипта/двоичного файла. Сценарий должен прочитать stdin
и после продолжения выполнить команду sendmail -t
для повторной отправки преобразованного сообщения локально. Самый простой сценарий, о котором я думаю, это следующий:
#!/bin/sh
cat /dev/stdin \
| sed '1 s/somelist@example.com/somelist-bounces@example.com/' \
| sendmail -t
####
exim
получит измененное сообщение и обработает его как обычно. Вы должны убедиться, что не создаются циклы маршрутизации и сообщения не передаются сценарию и обратно снова и снова.
Также вы должны убедиться, что у пользователя exim
достаточно прав для запуска скрипта и, особенно, команды sendmail -t
. Возможно, вам нужно правильно настроить правила sudo
.
если вы хотите переписать отправителя конверта в маршрутизаторе, используйте действие «ошибки _в» в этом маршрутизаторе
errors_to = list-bounces@example.org
http://www.exim.org/exim-html-current/doc/html/spec_html/ch-generic_options_for_routers.htmlговорит частично:
If an address for which errors_to has been set ends up being delivered over SMTP, the envelope sender for that delivery is the errors_to value, so that any bounces that are generated by other MTAs on the delivery route are also sent there.