2013-06-04 48 views
1

在Linux中,我可以運行命令:在UNIX上運行時SED性問題與Linux的

sed -r 's/^(.{2})0(.*)$/\1\2/' filename 

但是我不能做-r所以我嘗試:

sed 's/^(.{2})0(.*)$/\1\2/' filename 

我得到以下錯誤:

sed: command garbled: s/^(.{2})0(.*)$/\1\2/ 

我覺得有一個簡單的修復,但我不能弄明白。

+1

問[在這裏 - Unix/Linux StackExchange](http://unix.stackexchange.com/)他們一定會知道的。 – ProfessionalAmateur

+2

你想逃避那些parens /括號。您是否嘗試閱讀sed手冊? –

+0

你不能在你的Unix系統上安裝gnu sed嗎? –

回答

3

以下是爲我工作:

sed 's/^\(.\{2\}\)0\(.*\)$/\1\2/' 

你需要逃避(){}

編輯:這也將解決你的問題,是短。沒有必要繼續搜索到行的末尾。

sed 's/^\(.\{2\}\)0/\1/' 
1

量詞語法{n,m}和捕獲組是擴展正則表達式類的一部分。默認情況下,sed僅使用基本正則表達式。如果你讀你的Linux系統上的手冊頁,你會清楚地看到什麼-r做:

-r, --regexp-extended   use extended regular expressions in the script. 

檢查手冊頁sed你的Unix機器,看看是否有一個等效選項(可能-E)或逃脫ERE功能。

請參閱here BRE和ERE之間的差異。

1
sed 's/^\(.\{2\}\)0\(.*\)$/\1\2/' <filename> 

有關正則表達式的更多詳細信息,或只是谷歌閱讀手冊。隨機刪除參數不太可能奏效(儘管讚美「說出你所嘗試的」)。

1

並非所有的seds都是相同的。 RE間隔表達式如.{2}是現代擴展正則表達式(ERE)的一部分,而sed歷史上支持基本正則表達式(BRE)。某些機器上的一些seds根本不會支持ERE,因此您需要將表達式重寫爲BRE(..)或切換到其他工具。一旦你開始使用這個新工具,你仍然會遇到問題,因爲「RE間隔」是ERE的一個相對新近的增加,所以即使使用支持ERE的awk工具,也不是所有的awk都支持RE間隔。有些seds通過在大括號之前放置反斜槓來支持RE間隔,有些會通過添加像-r這樣的標誌來支持它們,以告訴sed {2}表示RE Interval而不是字面{2}。

所以,它有點混亂,但如果你有一個現代的sed然後機會添加-r標誌將爲你工作,如果你有一個POSIX awk或最近的GNU awk那麼RE間隔將簡單地工作默認。