2013-01-11 22 views
0

我有需要修改一些的bash腳本,我就非常喜歡不要用手做...基本上,它們都包含線搜索bash的for循環語法用perl命令

for ((i=${BEGIN} ; i < ${END} ; i++)) 

,我需要改變這

for ((i=${BEGIN}-1 ; i < ${END} ; i++)) 

的I = $ {} BEGIN是獨一無二的,在每個文件中只出現一次,所以我想我可以搜索和使用一個簡單的Perl命令替換它。我想出了是

> perl -w -i -p -e "s/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/" Script.sh 

這將導致以下錯誤

syntax error at -e line 1, near "{BEGIN" 
syntax error at -e line 1, near "}continue" 
Execution of -e aborted due to compilation errors. 

什麼是這裏的語法錯誤?

謝謝!

Tsadkiel

回答

7

使用單引號代替雙引號:

perl -w -i -p -e 's/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/' 

這樣,反斜槓不會被外殼去掉,所以perl的看到他們,他們逃離他們應該逃避什麼。

3

bash shell在參數"s/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/"到達Perl之前執行插值。讓我們看看如何可能的工作:

$ echo "s/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/" 
s/i=$\{BEGIN\}/i=$\{BEGIN\}-1/ 

取代s/i=$\{BEGIN\}/i=$\{BEGIN\}-1/將是一個問題,在Perl因爲Perl將把序列$\{作爲散列變量%\查找的開始,但它會編譯失敗因爲它不會找到(非轉動的)右大括號。所以,你真正想要Perl看到的是像

s/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/ 

而且至少有兩種方法可以改變你原來的命令行來實現:

  1. 逃離美元符號:

    perl -wpi -e "s/i=\\\$\{BEGIN\}/i=\\\$\{BEGIN\}-1/"

  2. 不想單引號,這是不是在bash插值:

    perl -wpi -e 's/i=\$\{BEGIN\}/i=\$\{BEGIN\}-1/'