2010-09-14 32 views
0

我想,我可以在任何文件上運行一個命令行功能,通過向include("myinc.inc"); PHP語句更改爲include 'myfile.inc';我已經開了一個頭下面我的〜/ .bashrc文件如何在bash腳本中使用Perl正則表達式字符?

function makestandard() { 
    perl -p -i -e 's/include\("([\w\.]+)"\)/include '$1'/g' $* 
} 

source ~/.bashrc;並在命令行中運行的命令如下:

$ makestandard myfile.php 

我得到myfile.php修改,但不是捕捉包括文件名,包含的文件名稱被損壞爲當前文件的名稱。作爲一個不知情的猜測,我認爲bash $1變量干擾了perl regexp變量的$1

我該如何解決這個問題?


背景信息(無需閱讀):我們已經使用PHP_CodeSniffer (phpcs)嗅出PHP代碼,並報告任何壞的「聞香」開始。不幸的是,phpcs不能解決非標準的代碼,它只會報告它。因此,我想編寫一個腳本來修復我們的PHP代碼中一些簡單和常見的非標準元素。我打算用一堆perl pie填充我的makestandard bash函數。

Shell環境:無論Ubuntu 10.04是開箱即用的。

回答

4

它不是bash的變量,它是在你的單引號的bash字符串的單引號。

+0

啊哈 - 謝謝我應該在寫這個問題時從語法高亮中發現了這個問題!用反斜槓轉義單引號會使命令無法獲得源代碼。 – Tom 2010-09-14 12:23:06

+1

''$ 1''變成''''''''''''。我使用['String :: ShellQuote'](http://p3rl.org/String::ShellQuote)模塊。 – daxim 2010-09-14 13:38:35

+0

@daxim不,它不。它全部在單引號內。這意味着'$ 1'受到保護。問題在於通過關閉單引號外殼字符串來取消保護(並在之後立即重新打開)。如果/ foo =「(。*)」/'「,我會說'perl -nle'打印$ 1。 – 2010-09-14 14:43:12

5

你應該逃脫你簡單一個引號刪除最後一個括號:

perl -p -i -e "s/include\(\"([\w\.])+\"\)/include '\$1'/g" $* 
+0

:'bash下的/ home /湯姆

以下似乎工作的OP希望的方式/.bashrc:第214行:意外的EOF,同時尋找匹配的' - 但如果我使用雙引號,所有感謝信息。 – Tom 2010-09-14 12:01:33

+0

爲什麼這是upvoted? Bash引用不起作用。 – daxim 2010-09-14 13:36:12

+0

@daxim,我的壞它已更新 – 2010-09-14 13:48:47

0

原來的Perl語句,如果它的工作,會發現

include("something.php") 

和書面

include 'something.php') 

也就是說,它會刪除左括號和單取代雙引號。並且不會根據需要更改擴展名。當我採購我的.bashrc * *文件時,我逃單引號我收到以下錯誤

function makestandard() { 
    perl -p -i -e 's/include\("(\w+)\.inc"\)/include("$1.php")/g' $* 
} 
+0

謝謝馬丁。對不起,在正則表達式中使用不正確的「)」字符,並在我的問題中使用了不正確的擴展名。我已經編輯它來關注主要問題 - 即如何逃避單引號。 – Tom 2010-09-14 16:23:53

相關問題