end_date=$(date +"%m/%d/%Y")
/usr/bin/perl -pi -e "s/_end_date_/${end_date}/g" filename
我想用当前日期替换字符串“_end_date_”。由于当前日期中有斜杠(是的,我想要斜杠),所以我需要对它们进行转义。我该如何做?
我尝试过几种方法,比如使用sed和Perl本身将斜杠替换为“/”,但都没有成功。最后,我使用了“cut”来分割日期成3个部分并转义斜杠,但这个解决方案看起来不太好。有更好的解决方案吗?
在Perl中,您可以选择使用哪个字符来分隔正则表达式的不同部分。以下代码将正常工作。
end_date = $(date +"%m/%d/%Y")
/usr/bin/perl -pi -e "s#_end_date_#${end_date}#g" filename
这是为了避免使用 / 和 alternating 时出现“倾斜的牙签”现象。
使用不同的s
分隔符:s{想要替换的所有斜杠/}{替换文本}
。
我建议更改分隔符,但你几乎总是可以使用 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/'
这行代码与你的两行代码实现的功能相同。
在Axeman的答案基础上,以下方法对我有效:
perl -MPOSIX=strftime -p -e'$ed=strftime( q[%m/%d/%Y], localtime()) ;s/_end_date_/$ed/'
需要注意的一些事情
/
。'
而不是"
,否则你必须引用$
-MPOSIX = strftime
而不是 BEGIN { use POSIX qw<strftime> }