Как заменить символ другим в переменной
Я хочу знать, есть ли способ заменить символ другим в переменной. Например, замена каждой точки подчеркиванием в строковой переменной.
2 ответа
Я не пробовал, но, основываясь на спецификации переменных, я бы попытался приблизиться к этому, пытаясь сопоставить текст до и после точки, а затем создать новые переменные на основе совпадений. Что-то вроде:
set "value" "abc.def";
if string :matches "${value}" "*.*" {
set "newvalue" "${1}_${2}
}
Это, конечно, будет соответствовать только одному периоду, потому что в Sieve нет циклических структур. Несмотря на то, что есть опция соответствия регулярному выражению, я не знаю ни одного расширения Sieve для замены регулярного выражения.
Другой подход к комплексной фильтрации почты, который вы можете сделать с Dovecot (если вам нужны петли и иметь полный доступ к почтовому серверу), это их специфичные для Dovecot расширения, такие как vnd.dovecot.pipe
что позволяет почтовому администратору определять полные программы (написанные на любом языке, который пожелает) для обработки почты на своем пути.
Следуя комментарию @BluE, если ваш вариант использования заключается в хранении электронной почты в папках на адрес получателя или что-то в этом роде, возможно, вам действительно нужна не общая функция замены символа, а какой-то способ создания почтовых ящиков с точками в их именах. В случае с голубятней, похоже, есть решение: [Dovecot]. (точка) в именах папок maildir
https://wiki2.dovecot.org/Plugins/Listescape
Убедитесь, что один из файлов в
/etc/dovecot/conf.d
содержит эту строку:
mail_plugins = listescape
Затем вы можете отфильтровать списки рассылки в отдельные поля на основе их идентификаторов.
Этот фрагмент скрипта Sieve выбирает идентификатор из
x-list-id
заголовок:
if exists "x-list-id" {
if header :regex "x-list-id" "<([\.@a-z_0-9-]+)" {
set :lower "listname" "${1}";
fileinto :create "mailing_list\\${listname}";
} else {
keep;
}
stop;
}