2

我正在使用以下(经典)procmail 配方来捕获邮件列表电子邮件并按列表名称将它们归档到文件夹中:

:0
* ^((List-Id|X-(Mailing-)?List):(.*[<]\/[^>]*))
{
    LISTID=$MATCH
    :0
    * LISTID ?? ^\/[^@\.]* 
    Lists/$MATCH/
}

问题是:如果列表名称从全小写变为 Firstlettercap,我最终会得到两个文件夹,一个用于“listname”,另一个用于“Listname”。

我想在最终交付规则中使用 $MATCH 变量之前将其小写,但我无法找到对 lc() 函数的引用或可用于执行此操作的正则表达式/替换。

下面的一条评论建议了这一点:

:0
 * ^((List-Id|X-(Mailing-)?List):(.*[<]\/[^>]*))
 {
    LISTID=`echo "$MATCH" | tr A-Z a-z`
    :0
    * LISTID ?? ^\/[^@\.]*
    .Lists.$MATCH/
 }

这似乎也不符合我的要求。不过,现在看,很明显,音译只发生在第一次出现 $MATCH 时,我的猜测是它根本没有改变它以便在文件夹分配行中使用。

更新#1:如果我尝试在文件夹分配行中使用 LISTID,我会得到类似“Bricolage.project.29601.lighthouseapp”的东西,而不仅仅是“Bricolage”,或者——我所追求的——只是“bricolage”。

4

2 回答 2

1

Procmail 本身没有用其他文本替换文本的功能。您可以通过 运行匹配tr,或者如果避免外部进程非常重要,则为您需要映射的每个字母创建一个规则。

LISTID=`echo "$LISTID" | tr A-Z a-z`

# or alternatively
:0D
* LISTID ?? ^A\/.*
{ LISTID="a$MATCH" }
:0D
* LISTID ?? ^B\/.*
{ LISTID="b$MATCH" }
# ... etc

您可以将其与最终的 MATCH 处理结合起来,但为了清楚起见,我将其保留在此处。

于 2011-08-06T22:48:48.853 回答
0

无论如何,AFAIK procmail 正则表达式始终不区分大小写,因此您无需做任何特殊操作即可获得所需的内容。至少我一直这样使用它,我检查过的所有带有 procmail 文档的站点(3+)也都这么说。

于 2011-05-13T19:56:52.210 回答