我想用另一個字串替換包含 $ 符號的檔案中的一些字串,該字串也包含 $ 符號加上來自 bash 變數的值。該檔案包含如下字串。
$Rev: 12345 $ $Author: 12345 $
假設我有一個名為i包含字串的 bash 變數foo。我現在想$Rev: 12345 $用$Rev: $i $. 我嘗試使用 sed,但由于 sed 不支持非貪婪的正則運算式,我切換到 perl。當我不使用任何 bash 變數時,Perl 可以正常作業。
# cat file
$Rev: 12345 $ $Author: 12345 $
# perl -p -i -e 's;\$Rev:.*?\$;\$Rev: test \$;g' file
# cat file
$Rev: test $ $Author: 12345 $
但無論我如何轉義命令中的 $ 符號,我都無法讓它與 bash 變數一起使用。
# cat file
$Rev: 12345 $ $Author: 12345 $
# i="foo"
# echo $i
foo
# perl -p -i -e "s;\$Rev:.*?\$;\$Rev: $i \$;g" file
Final $ should be \$ or $name at -e line 1, within string
syntax error at -e line 1, near "s;$Rev:.*?$;$Rev: foo $;g"
Execution of -e aborted due to compilation errors.
# perl -p -i -e "s;\\$Rev:.*?\\$;\$Rev: $i \\$;g" file
# cat file
$Rev: foo $ $Author: foo $
謝謝你的幫助!
uj5u.com熱心網友回復:
最好在 Perl 中使用 Perl 變數,而不是讓 shell 將其變數擴展為 Perl 代碼。
perl -i~ -pe 's/^\$Rev:.*?\$/\$Rev: $i \$/g' -s -- -i="$i" file
然后,您可以在代碼周圍使用單引號,這樣可以更輕松地正確反斜杠。
告訴 Perl在運行代碼之前-s接受-var=val開關并將 Perl 變數設定$var為。val
uj5u.com熱心網友回復:
嘗試$i完全放在引號之外:
perl -pi -e 's;\$Rev:.*?\$;\$Rev: '$i' \$;g' file
# ^---------------------^ ^-----^
或者,您可以export將變數分配給子行程,并通過%ENVPerl 中的哈希訪問它:
export i="foo"
perl -pi -e 's;\$Rev:.*?\$;\$Rev: $ENV{i} \$;g' file
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513188.html
標籤:重击perl代替
上一篇:按名稱參考包
