如何用变量中的另一个字符替换一个字符

How to replace a character by another in a variable

我想知道是否有办法将变量中的一个字符替换为另一个字符。例如,用字符串变量中的下划线替换每个点。

我没试过,但基于 Variables specification,我尝试解决这个问题的方法是尝试匹配点前后的文本,然后制作新的基于匹配的变量。类似于:

set "value" "abc.def";
if string :matches "${value}" "*.*" {
    set "newvalue" "_
}

当然,这只会匹配单个句点,因为 Sieve 不包含任何循环结构。虽然有 regex match option,但我不知道有任何正则表达式替换 Sieve 扩展。

您可以使用 Dovecot 进行复杂邮件过滤的另一种方法(如果您确实需要循环并具有对邮件服务器的完全访问权限)是它们的 Dovecot-specific extensionsvnd.dovecot.pipe 类似,它允许邮件管理员定义完整的程序(用任何一种语言编写)来处理邮件。

根据@BluE 的评论,如果您的用例是将 e-mails 存储在每个收件人地址的文件夹中或类似的东西,也许您实际上并不需要通用字符替换功能,而是需要一些创建邮箱的方法他们的名字中带有点。对于鸽舍,似乎有一个解决方案:[Dovecot] . (dot) in maildir folder names

https://wiki2.dovecot.org/Plugins/Listescape

确保 /etc/dovecot/conf.d 中的文件之一包含此行:

mail_plugins = listescape

然后您可以根据邮件列表的 ID 将邮件列表过滤到单独的邮箱中。

此 Sieve 脚本片段从 x-list-id header:

中选取 ID
if exists "x-list-id" {
    if header :regex "x-list-id" "<([\.@a-z_0-9-]+)" {
        set :lower "listname" "";
        fileinto :create "mailing_list\${listname}";
    } else {
        keep;
    }
    stop;
}