如何在Perl正则表达式中转义斜杠?

3
end_date=$(date +"%m/%d/%Y")
/usr/bin/perl -pi -e "s/_end_date_/${end_date}/g" filename

我想用当前日期替换字符串“_end_date_”。由于当前日期中有斜杠(是的,我想要斜杠),所以我需要对它们进行转义。我该如何做?
我尝试过几种方法,比如使用sed和Perl本身将斜杠替换为“/”,但都没有成功。最后,我使用了“cut”来分割日期成3个部分并转义斜杠,但这个解决方案看起来不太好。有更好的解决方案吗?
4个回答

17

在Perl中,您可以选择使用哪个字符来分隔正则表达式的不同部分。以下代码将正常工作。

end_date = $(date +"%m/%d/%Y")
/usr/bin/perl -pi -e "s#_end_date_#${end_date}#g" filename

这是为了避免使用 / 和 alternating 时出现“倾斜的牙签”现象。


6

使用不同的s分隔符:s{想要替换的所有斜杠/}{替换文本}


1

我建议更改分隔符,但你几乎总是可以使用 quotemeta:

/usr/bin/perl -pi -e "my \$ed=quotemeta('${end_date}');s/_end_date_/\$ed/g" filename

但你也有这个路由:

/usr/bin/perl -pi -e 'BEGIN { use POSIX qw<strftime>; $ed=quotemeta(strftime( q[%m/%d/%Y], localtime())); } s/_end_date_/$ed/'

这行代码与你的两行代码实现的功能相同。


0

在Axeman的答案基础上,以下方法对我有效:

 perl -MPOSIX=strftime  -p -e'$ed=strftime( q[%m/%d/%Y], localtime()) ;s/_end_date_/$ed/'

需要注意的一些事情

  • 不需要使用quotemeta,因为编译器不会在变量 $ed 中查找 /
  • 我使用单引号'而不是",否则你必须引用$
  • 我更喜欢使用-MPOSIX = strftime 而不是 BEGIN { use POSIX qw<strftime> }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接