2
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

4 回答 4

16

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

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

这是为了避免与/交替出现“倾斜牙签”综合症。

于 2010-06-11T05:56:11.113 回答
6

使用不同的s分隔符:s{all/the/slashes/you/want/}{replacement}.

于 2010-06-11T05:57:04.940 回答
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/'

这与你的两条线做同样的事情。

于 2010-06-11T13:41:56.107 回答
0

基于 Axeman 的回答,以下内容对我有用:

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

需要注意的几点

  • /不需要 quotemeta ,因为编译器不在变量中寻找 a $ed
  • 我使用了单引号',而不是"你最终不得不引用$
  • 我更喜欢 -MPOSIX=strftime使用BEGIN { use POSIX qw<strftime> }
于 2010-06-11T20:04:45.973 回答