2013-02-12 93 views
0

所以,我環顧四周尋找答案,實際上我發現了一些,但似乎沒有工作...perl從命令行查找並替換。特殊字符?

我有一個文件夾,裏面裝滿了需要修改的bash腳本。具體而言,我需要

INPUT=/data/hawc01/hawcroot/data/hawc/reconstructed/quesadilla/${RUN} 

更換線

INPUT=/data/scratch02/mpgussert/HAWC-30/${RUN}_reco 

我已經試過這

perl -w -i -p -e "s'INPUT=/data/scratch02/mpgussert/HAWC-30/${RUN}_reco'INPUT=/data/hawc01/hawcroot/data/hawc/reconstructed/quesadilla/${RUN}'g" *.sh 

其執行沒有錯誤,但沒有查找和替換所需的文本。根據我的理解,使用'去除正則表達式應該搜索沒有特殊字符替換。那是對的嗎?如果是這樣,任何想法爲什麼失敗?

我也曾嘗試

perl -w -i -p -e "s/INPUT=\/data\/scratch02\/mpgussert\/HAWC-30\/\$\{RUN\}_reco/INPUT=\/data\/hawc01\/hawcroot\/data\/hawc\/reconstructed\/quesadilla\/\$\{RUN\}/g" *.sh 

反斜槓應該忽略特殊字符替換,但返回以下錯誤。

Backslash found where operator expected at -e line 1, near "RUN\" 
syntax error at -e line 1, near "RUN\" 
Execution of -e aborted due to compilation errors. 

所以它搜索RUN \,這不是我想要的......任何想法?我將不勝感激任何幫助。

謝謝!

+2

你必須建立一個shell命令的問題,所以這將是很好的知道哪些外殼使用的是! – ikegami 2013-02-12 20:21:39

+1

用'''嘗試。許多shell會根據此更改插值,錯誤消息聽起來像。另外,考慮更改'/'分隔符以避免「傾斜牙籤」。例如,將牙籤直放:'s | INPUT =/foo/bar |真棒|':D(儘管這不是唯一可能的分隔符替換,並且如果需要*替換*,它的選擇很差)。 – 2013-02-12 20:25:18

+0

我在Bash,謝謝! – Tsadkiel 2013-02-12 20:38:35

回答

1

你想要的圖案爲...\$\{RUN\}...,但是這不是你傳遞什麼:

$ echo "...\$\{RUN\}..." 
...$\{RUN\}... 

您也需要做更多的逃逸,或者切換到單引號。

$ echo '...\$\{RUN\}...' 
...\$\{RUN\}... 

一起:

perl -i -wpe' 
    s{INPUT=/data/scratch02/mpgussert/HAWC-30/\$\{RUN\}_reco} 
    {INPUT=/data/hawc01/hawcroot/data/hawc/reconstructed/quesadilla/\${RUN}}g 
' *.sh 
+0

輝煌!謝謝ikegami! – Tsadkiel 2013-02-12 21:09:58