如何在正则表达式中使用的Perl文本中转义斜杠?

时间:2010-06-11 05:48:30

标签: regex perl escaping slash

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 个答案:

答案 0 :(得分:16)

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

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

这是为了避免'倾斜牙签'综合征与/交替。

答案 1 :(得分:5)

使用其他s分隔符:s{all/the/slashes/you/want/}{replacement}

答案 2 :(得分: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/'

与你的两行完全相同。

答案 3 :(得分:0)

以Axeman的答案为基础,以下内容适用于我:

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

需要注意的一些事项

  • 不需要quotemeta,因为编译器没有在变量/中查找$ed
  • 我使用单引号'而不是",否则您最终不得不引用$
  • 我更喜欢使用-MPOSIX=strftimeBEGIN { use POSIX qw<strftime> }