2015-06-30 81 views
2

我與gnu-sed工作,我已經找到了以下內容:爲什麼gnu-sed與-i需要一切都要逃脫?

sed -r 's|((https?://)?(www\.)?)example\.com\.au|\1|gi' test.txt 

沒有-i,這會工作得很好,而且與test.txt以下行:

https://www.example.com.au 

但是如果我添加-i,我需要逃脫幾乎所有的東西(,即使是問號),以達到相同的結果。它結束了看起來像:

 sed -ir 's|\(\(https\?://\)\?\(www\.\)\?\)example\.com\.au|\1|gi' test.txt 
#COMP:sed -r 's|((https?://)?(www\.)?)example\.com\.au|\1|gi' test.txt 

這更噁心......我不喜歡它:(

我無法找到任何man sed解釋這個

爲什麼。出現這樣的情況,是有它周圍什麼辦法?

回答

6

短摘自documentation

-i[SUFFIX]
--in-place[=SUFFIX]
此選項指定文件是就地進行編輯。

當寫:

sed -ir '...' 

sed解釋命令行-i後跟後綴以用於備份文件(在上面的摘錄呈現的短形式)。

因此,它不會再看到-r選項,並將最後一個參數解釋爲基本regex而不是擴展regex。正如相同的文檔頁面所說,「擴展正則表達式可以更清晰,因爲它們通常具有更少的反斜槓」

的解決方案很簡單:添加-i命令行選項分開,-r結合起來:

sed -i -r 's|((https?://)?(www\.)?)example\.com\.au|\1|gi' 

(有參數不能合併的命令行選項。)

+1

「有參數的命令行選項不能組合。」這不是真的;帶參數的選項可以遵循非參數選項,所以'sed -ri ...'可以正常工作。 – cmbuckley

1

這是因爲-i選項期望一個文件的說法。如果切換參數-ri,你會看到錯誤。將它作爲-ir告訴sed從文件r中讀取,因此它不使用使用-r選項啓用的擴展正則表達式選項。

+0

哦,對不起@ mart1n,實際上我正在向它提供一個文件,但它不會匹配並編輯該文件,除非我添加所有這些斜線。我將編輯該問題。 –

+0

Ohhhh我明白了!對不起,這是正確的,它只是花了我一段時間,看看'-i'本身期望一個文件,而不是整個腳本。 –

+0

@ mart1n,你說:「把它當作'-ir'告訴sed從文件'r'中讀取......」,它沒有這樣的東西!它將'-ir'中的'r'作爲後綴,如在axiac的正確答案中顯示的手冊頁中的「-i [SUFFIX]」。 – user3439894