Я использую header_checks в Postfix, чтобы переписать свои заголовки (для писем, отправленных Outlook через мой сервер).
Вот часть заголовка, которую я пытаюсь изменить:
Received: from Raphasus (****.abo.wanadoo.fr [***.***.***.109])
by mail.********.com (Postfix) with ESMTPSA id 917***CE9
for <raph*****@hotmail.fr>; Thu, 31 Jul 2014 09:38:35 +0200 (CEST)
Что я хочу сделать: заменить только ПЕРВУЮ СТРОКУ (персонализированной информацией) и добавить две последние строки.
Что пробовал (в header_checks):
/^\s*(Received: from).*$(.*)/ REPLACE $1 my personalized text $2
Он работает только тогда, когда я удаляю $ 2 (поэтому он заменяет полный Received: from моим текстом), если я помещаю $ 2, он просто не заменяет мой заголовок.
Я думаю, что эта часть правильная:
/^\s*(Received: from).*$
Это выбор первой строки или «Получено: от». Но как я могу сказать, что то, что следует в моем регулярном выражении, следует рассматривать как параметр $ 2?
Я искал везде и не мог найти (посмотрел синтаксис POSIX, синтаксис PERL (как этот документ говорит, что «Замена подстрок из совпадающего выражения в строку действия возможна с использованием обычного синтаксиса Perl»))
Я нашел рабочий пример с параметрами $ 1 и $ 2:
/^\s*(Received: from)[^\n]*(.*)/ REPLACE $1 [127.0.0.1] (localhost [127.0.0.1])$2
Но я просто не понимаю, где он решает, что такое 1 доллар, а что 2 доллара.
PS: Я разместил этот вопрос на ServerFault, но теперь задаюсь вопросом, не должно ли его быть на StackOverflow?
РЕДАКТИРОВАТЬ : Новые вещи, которые я пробовал, и результаты:
/^\s*(Received: from).*\((.*)/ REPLACE $1 mytext ([xxx.xxx.xxx.xxx])$2
Это дает мне:
Received: from mytext ([xxx.xxx.xxx.xxx])CEST)
Я действительно не понимаю, почему он не обнаруживает открывающую скобку раньше (кажется, он обнаруживает только после ";")
РЕДАКТИРОВАТЬ2: Дальнейшее тестирование
Поэтому я попытался удалить строку, чтобы убедиться, что мой заголовок остался той же формы, что и раньше. Вот результат:
Received: from Raphasus (xxxxxxxxxxxxxxxxx.abo.wanadoo.fr [xxx.xxx.xxx.xxx])
by mail.xxxxxxxx.com (Postfix) with ESMTPSA id 5B1xxxxxxF
for <raphxxxxx@hotmail.fr>; Thu, 31 Jul 2014 14:03:57 +0200 (CEST)
Поэтому, учитывая тот факт, что в этом заголовке много «0», я попытался поместить следующую строку в мои header_checks, чтобы увидеть, где она сокращается:
/^\s*(Received: from).*(0.*)/ REPLACE $1 mytext ([xxx.xxx.xxx.xxx])$2
И я получаю следующий результат:
Received: from mytext ([xxx.xxx.xxx.xxx])0 (CEST)
Это невероятно странно, и я понятия не имею, почему он обрезается на этом нуле, а не на любом из нулей раньше (в 2014 году в IP-адресах, даже в +0200, почему последний? И т. Д.)
Если вы хотите удалить / заменить определенные строки или части строк, часто лучше постараться быть как можно более конкретным. В вашем случае вы захотите попытаться более точно сопоставить текст после from, а также имя сервера и ip.
Что-то вроде этого должно работать лучше:
([a-z]{2,25} \(.*\[.*\]\))