首页 > 解决方案 > 使用 Perl 全局替换电子邮件地址

问题描述

我尝试使用 Perl 来全局替换我的 shell 脚本中的电子邮件地址,但如果有 @ 字符,Perl 似乎无法替换。

我的 shell 脚本的一部分:

MAIL_LIST_2="user01@abc.com"

perl 命令:

perl -pi -e "s/user01@abc.com/user01@devemail.abc.com/g" test.sh

任何想法?

标签: perlemailstring-interpolation

解决方案


在 Perl 代码中转义@电子邮件地址中的符号:

echo 'MAIL_LIST_2="user01@abc.com"' |
perl -p -e "s/user01\@abc.com/user01\@devemail.abc.com/g"

这给出了输出:

MAIL_LIST_2="user01@devemail.abc.com"

问题是 Perl 将未转义@的数组视为数组的标志,并尝试将(不存在的)数组的内容插入到正则表达式中,这无法按您的意愿工作。

请注意,如果您在命令行或脚本文件中启用了警告 - <code>-w use strict; use warnings;- 那么您会被告知为什么事情没有那么好:

echo 'MAIL_LIST_2="user01@abc.com"' |
perl -pwe "s/user01@abc.com/user01@devemail.abc.com/g"
Possible unintended interpolation of @abc in string at -e line 1.
Possible unintended interpolation of @devemail in string at -e line 1.
Name "main::abc" used only once: possible typo at -e line 1.
Name "main::devemail" used only once: possible typo at -e line 1.
MAIL_LIST_2="user01@abc.com"

道德:总是在 Perl 脚本中启用警告——它避免了不必要的痛苦。


推荐阅读