end_date=$(date +"%m/%d/%Y")
/usr/bin/perl -pi -e "s/_end_date_/${end_date}/g" filename
我想用当前日期替换字符串'_end_date_'。由于当前日期中有斜杠(是的,我想要斜杠),我需要逃避它们。我怎么能这样做?
我尝试了几种方法,例如使用sed和Perl本身用“/”替换斜杠,但它不起作用。最后我使用'cut'来打破3个部分的日期并逃脱斜线,但这个解决方案看起来不太好。有更好的解决方案吗?
答案 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/'
需要注意的一些事项
/
中查找$ed
。'
而不是"
,否则您最终不得不引用$
-MPOSIX=strftime
到BEGIN { use POSIX qw<strftime> }