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

文字列「_end_date_」を現在の日付に置き換えたい。現在の日付にはスラッシュが含まれているため (はい、スラッシュが必要です)、それらをエスケープする必要があります。これどうやってするの?

sedと Perl 自体を使用してスラッシュを「/」に置き換えるなど、いくつかの方法を試しましたが、うまくいきませんでした。最後に、「カット」を使用して日付を 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/'

これは、2 行と同じことを行います。

于 2010-06-11T13:41:56.107 に答える
0

Axemanの答えに基づいて、次のことがうまくいきます:

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

注意事項

  • /コンパイラは変数内で a を探していないため、quotemeta は必要ありません$ed
  • 私は一重引用符を使用しましたが、それ'以外"の場合は引用する必要があります$
  • -MPOSIX=strftime私はに使用することを好みます BEGIN { use POSIX qw<strftime> }
于 2010-06-11T20:04:45.973 に答える