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

我想用當前日期替換字符串'_end_date_'。由於當前日期已經縮減(是的,我想要斜槓),我需要逃避它們。我怎樣才能做到這一點?如何在正則表達式中使用的Perl文本中跳轉斜槓?

我已經嘗試了幾種方法,例如使用sed和Perl本身替換「/」斜槓,但它沒有奏效。最後,我使用'cut'將日期分成3部分並跳過斜槓,但這種解決方案看起來不太好。有更好的解決方案嗎?

回答

16

在Perl中,您可以選擇使用哪個字符來分隔正則表達式的各個部分。以下代碼將正常工作。

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

這是爲了避免'傾斜牙籤'綜合徵/交替。

5

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

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/' 

它做同樣的事情,你的兩條線。

0

大廈斧頭兵的回答,對我下面的作品:

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

有幾件事情需要注意

  • ,則不需要quotemeta因爲編譯器是不是找一個/變量$ed
  • 我用單引號',而不是"否則你最終不得不引用$
  • 我更喜歡使用-MPOSIX=strftimeBEGIN { use POSIX qw<strftime> }
相關問題