2012-05-14 28 views
0

我想要替換(整個字符串)無與倫比的括號中的正則表達式 - Linux的

$(TOPDIR)/$(OSSCHEMASDIRNAME) 

/udir/makesh/$(OSSCHEMASDIRNAME) 
makefile

 perl -pi.bak -e "s/\$\(TOPDIR\)\/\$\(OSSCHEMASDIRNAME\)/\/udir\/makesh\/\$\(OSSCHEMASDIRNAME\)/g " makefile 

但試圖

我變得無法匹敵hed圓括號錯誤

+1

爲什麼不設置'$(TOPDIR )'到你想要的目錄?這就是變量的用途。 – Mat

+0

@Mat:爲此我只提到了「整個字符串」。我不想打擾$(TOPDIR),否則所有文件將在/ udir/makeh /下生成,從而導致錯誤。 $(TOPDIR) - 根目錄 – Makesh

+0

將程序放在文件中有時更容易,因此您不必處理shell元字符問題。 –

回答

2

您必須「雙倍」逃避美元符號。像這樣:

echo "\$(TOPDIR)/\$(OSSCHEMASDIRNAME)" | perl -p -e "s/\\$\(TOPDIR\)\/\\$\(OSSCHEMASDIRNAME\)/\/udir\/makesh\/\\$\(OSSCHEMASDIRNAME\)/g" 
2

首先,您不需要使用/作爲正則表達式。他們只是規範的。你可以使用任何東西。因此,你的代碼可以成爲(簡化掉一些\):

perl -pi.bak -e "s|\$\(TOPDIR\)/\$\(OSSCHEMASDIRNAME\)|/udir/makesh/\$\(OSSCHEMASDIRNAME\)|g " makefile 

我們真正解決您的問題,因爲您使用"代替',外殼試圖找出$\手段,然後與更換(據推測)沒有。所以,你真正想要的是:

perl -p -i.bak -e 's|\$\(TOPDIR\)/\$\(OSSCHEMASDIRNAME\)|/udir/makesh/\$\(OSSCHEMASDIRNAME\)|g' makefile 
+0

它不工作:(...我有數百個生成文件,所以我使用-p選項..你也使用'|'符號,是否有可能在單個去做多個「查找和替換」? – Makesh

+0

感謝提醒我$符號在shell中的作用。 – Makesh

0

當有關轉義疑問,你可以簡單地使用quotemeta\Q ... \E

perl -pe 's#\Q$(TOPDIR)\E(?=/\Q$(OSSCHEMASDIRNAME)\E)#/udir/makesh#;' 

請注意使用前瞻斷言爲我們節省了在替換中重複尾隨部分的麻煩。

一個quotemeta的解決辦法是這樣的:

perl -pe 'BEGIN { $dir = quotemeta(q#$(TOPDIR)/$(OSSCHEMASDIRNAME)#); } 
      s#$dir#/udir/makesh/$(OSSCHEMASDIRNAME)#;' 

當然,你不需要使用的實際需要一行代碼。當shell引用造成的麻煩,他們所有的最簡單的辦法是寫一個小的源文件腳本:

s#\Q$(TOPDIR)\E(?=/\Q$(OSSCHEMASDIRNAME)\E)#/udir/makesh#; 

而且隨着運行:

perl -p source.pl inputfile