Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在正则表达式中使用的Perl文本中转义斜杠?_Regex_Perl_Escaping_Slash - Fatal编程技术网

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

Regex 如何在正则表达式中使用的Perl文本中转义斜杠?,regex,perl,escaping,slash,Regex,Perl,Escaping,Slash,我想用当前日期替换字符串“\u end\u date”。因为当前日期中有斜杠(是的,我想要斜杠),所以我需要避开它们。我该怎么做 我尝试过几种方法,比如使用“/”和Perl本身替换斜杠,但都不起作用。最后,我使用“cut”将日期分成3部分,并避开了斜杠,但这个解决方案看起来不太好。有更好的解决方案吗?在Perl中,您可以选择使用哪个字符来分隔正则表达式的各个部分。下面的代码可以正常工作 end_date=$(date +"%m/%d/%Y") /usr/bin/perl -pi -e "s/_e

我想用当前日期替换字符串“\u end\u date”。因为当前日期中有斜杠(是的,我想要斜杠),所以我需要避开它们。我该怎么做


我尝试过几种方法,比如使用“/”和Perl本身替换斜杠,但都不起作用。最后,我使用“cut”将日期分成3部分,并避开了斜杠,但这个解决方案看起来不太好。有更好的解决方案吗?

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

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

这是为了避免“倾斜牙签”综合征与/交替使用

使用不同的
s
分隔符:
s{all/the/slashes/you/want/}{replacement}
我建议您更改分隔符,但您几乎总是可以使用quotemeta:

end_date = $(date +"%m/%d/%Y")
/usr/bin/perl -pi -e "s#_end_date_#${end_date}#g" filename
但你也有这样的路线:

/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;$ed=quotemeta(strftime(q[%m/%d/%Y],localtime());}s/_end_date/$ed/'

这与您的两行代码的功能相同。

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

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

  • 不需要quotemeta,因为编译器没有在变量
    $ed
    中查找
    /
  • 我使用了单引号
    ,而不是
    ,否则您最终不得不引用
    $
  • 我更喜欢使用
    -mpoix=strftime
    而不是
    开始{useposixqw}
 perl -MPOSIX=strftime  -p -e'$ed=strftime( q[%m/%d/%Y], localtime()) ;s/_end_date_/$ed/'