2013-05-19 41 views
50

我運行了幾個替換命令作爲colorize script for maven的核心。 其中一個sed命令使用正則表達式,它在shell中以discussed here的形式查找。目前(不工作)的實施可以找到heresed錯誤:「s'命令的RHS上的無效參考 1」

當我包括命令的變體到腳本不同的行爲之一發生:

變型1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g" 

適應於腳本:

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \ 

錯誤:她我會輸出相同的信息,就好像我會輸入$ sed一樣。奇怪!?


變體2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g" 

適應於腳本:

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \ 

錯誤:

sed: -e expression #7, char 59: invalid reference \1 on `s' command's RHS

+5

在我來說,我已經聯合起來了'-i'(替代選項編輯)與'-re',導致'-ire'(這樣'-i'消耗're'片段作爲它的'SUFFIX'參數,因此擴展正則表達式模式沒有被啓用)。將其更改爲'-i -re'解決了問題。 –

+0

還要注意,單引號'''和雙引號'''會被略微區別對待,特別是在解釋'$ vars'時,例如:'sudo sh -c「sed -r -i's /(^。 + _supplicant.conf)/ \ 1 $ {MTXT} /'/ etc/network/interfaces「工作,但是:'sudo sh -c'sed -r -i」s /(^.+_ supplicant.conf)/ \ 1 $ {MTXT} /「/ etc/network/interfaces'' does not。 – not2qubit

回答

15

難道你不需要實際捕獲的工作?即對於變種2:

-e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \ 

(注:未經測試)

+22

對於sed的'-r'選項似乎是必要的,例如'sed -e's /([[ :數字:]])/是一個數字/''工作,但是'sed -e's /([[:digit:]])/ \ 1是一個數字/'產生原始錯誤,沒有'-r'到sed 。**注意:**第一次調用sed搜索文字'()'而**不是**捕獲組。 –

+0

答案下方的註釋實際上是一個答案。也許你可以編輯你的答案反映它 – miroxlav

+0

@AndrewFalanga你應該發表了你的評論作爲回答 – sanmai

4

你需要躲避.

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g" 

/或者,如果你不想擔心逃跑,使用|編輯:

sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g" 
+0

聲音合理。但它在腳本的上下文中不起作用。 – JJD

+0

檢查我的編輯,也許它可以幫助 – slackmart

+0

對不起。編輯引發錯誤:'sed:-e表達式#7,字符58:無效的範圍結束符。 @Denis的答案有效。 – JJD

36

這個錯誤對於沒有轉義的圓括號是很常見的。逃脫它們,然後再試一次。


例如:

/^$/b 
:loop 
$!{ 
N 
/\n$/!b loop 
} 
s/\n(.)/\1/g 

應與每個括號之前的反斜槓進行轉義:

/^$/b 
:loop 
$!{ 
N 
/\n$/!b loop 
} 
s/\n\(.\)/\1/g 
+0

注意,如果你使用'-r'你不必逃避括號。 –

相關問題