Bash Perl中使用Perl特殊字符的变量替换

Bash Perl中使用Perl特殊字符的变量替换,bash,perl,sed,Bash,Perl,Sed,我想用Perl替换包含@字符的子字符串,如下sed命令所示: substitution='newusername@anotherwebsite.com' sed 's/oldusername@website.com/'"${substitution}"'/g' <<< "The current e-mail address is oldusername@website.com" 我读过关于使用单引号(如下所示)的文章,但我想知道是否还有

我想用Perl替换包含
@
字符的子字符串,如下sed命令所示:

substitution='newusername@anotherwebsite.com'
sed 's/oldusername@website.com/'"${substitution}"'/g' <<< "The current e-mail address is oldusername@website.com"
我读过关于使用单引号(如下所示)的文章,但我想知道是否还有其他方法可以使用正斜杠

substitution='newusername@anotherwebsite.com'
perl -pe "s'oldusername@website.com'"${substitution}"'g" <<< "The current e-mail address is oldusername@website.com"
substitution=newusername@anotherwebsite.com'

perl-pe“s”oldusername@website.com“${substitution}”g“最干净的方法是将值传递给Perl,因为它可以正确处理替换模式和替换中的变量。使用单引号,这样shell的变量扩展就不会产生干扰。您可以使用
-s
选项(如中所述)

#/bin/bash
图案=oldusername@website.com
替代品=newusername@anotherwebsite.com

perl-spe的/\Q$pat/$sub/g'--pat=“$pattern”-sub=“$sub=“$substitution”@TLP:你说的“更容易”是什么意思?在调用Perl之前,您需要导出它们或分配它们,并且需要访问散列以获取值。@TLP:添加了%ENV用法。@TLP,用于您的。祝你有一个愉快的一天@TLP,我可以建议我们删除不相关的注释,以免淹没这个答案吗?@TLP“您真的需要
在bash中导出
变量,然后才能在Perl内部
%ENV
中访问它们,即使它们是在同一个shell脚本中定义的?”--
导出
-ing使它们成为“全局”(环境)变量,而仅仅是赋值使它们“局部”,而不是传播到子进程;看见但在同一语句中赋值是有效的。在bash中:
v=7;perl——我们说$ENV{v}
不起作用(如果没有
它就起作用)。因此需要导出
,除非它总是在同一语句中设置和使用
substitution='newusername@anotherwebsite.com'
perl -pe "s'oldusername@website.com'"${substitution}"'g" <<< "The current e-mail address is oldusername@website.com"