2011-07-20 64 views
11

能正常工作在Linux(Debian的):桑達正則表達式的問題,工作正常,在Linux上

sed -e 's,^[ \t]*psd\(.*\)\;,,' 

在Mac上,我相信我有使用-E標誌,而不是-e

sed -E 's,^[ \t]*psd\(.*\)\;,,' 

但正則表達式不匹配,因此不會刪除我想要的行。

有關如何解決這個問題的任何提示?

樣品輸入:

apa 
bepa 
    psd(cepa); 
depa psd(epa); 
    psd(fepa gepa hepa); 

對於輸入,預期輸出是:

apa 
bepa 
depa psd(epa); 
+1

您的預期輸出應該有幾行空行。你不需要轉義分號。 –

回答

9

-E該標誌表示使用擴展正則表達式。您應該只使用-e,就像在Linux上一樣。 Mac OS X中的sed基於BSD sed,因此不具有GNU擴展。

複製你的樣品輸入後:

[~ 507] pbpaste | sed -e 's,^[[:space:]]*psd\(.*\);,,' 
apa 
bepa 

depa psd(epa); 
+1

'-E'也適用於GNU sed,它是一個無證的選項,他們添加了符合POSIX – NDM

2

我已經檢查我的機器上這個樣本輸入和所面臨的問題時,在第三行是從線和正則表達式^[ \t]*psd\(.*\)\;年初製表符不匹配它。這可以通過sed字符類[[:blank:]]來傳遞,它們等於空格和製表符的組合。所以,你可以嘗試以下方法:

sed -E 's,^[[:blank:]]*psd\(.*\)\;,,' demo.txt 

這產生下面的輸出:

apa 
bepa 

depa psd(epa); 

但它一直空行的結果。 爲了得到確切的輸出如您所願我用下面的:

sed -n '/^[[:blank:]]*psd\(.*\)\;/!p' demo.txt 

結果:

apa 
bepa 
depa psd(epa); 

這是匹配模式(!p)只是逆輸出。

編輯:要在sed(MacOSX的)正則表達式匹配製表符,你也可以從How can I insert a tab character with sed on OS X?

7

'\t''sed'標準嘗試推薦,它是GNU擴展。

要匹配'tab',您需要在腳本中添加一個真實的'tab'。這在文件中很容易,在外殼上更難。

在AIX,Solaris和HP-UX或其他UNIX中可能會發生同樣的問題。

+6

我錯過了我的答案。你總是可以使用POSIX字符類,無論是[[[:space:]]還是'[[:blank:]]'都可以工作。要在shell中獲得一個文字標籤,按下ctrl-v會給你一個下一個字符的文字。 –

6

或者,您可以使用sed的GNU版本,而不是Mac OSX提供的實現。

Mac port爲此提供了端口sudo port install gsed。安裝完成後,您可以使用gsed而不是sed

+5

或'brew brew gnu-sed --default-names'用於釀造人:) –

+1

對於那些喜歡@ AntonBabenko的人,請注意'--default-names'在最近的版本中已被棄用。使用'brew install gnu-sed --with-default-names' **,然後重新打開終端**。 –

4

除了上面的答案,您可以利用一個有用的(但是依賴於shell)的技巧。在bash中,使用$'\t'來引入一個字面製表符。在我的Mac了以下工作:

sed -e 's,^[ '$'\t''*psd\(.*\);,,'

注意整個SED表達現在的三個連續串如何組成。

這個技巧可能對您特別需要製表符而沒有匹配其他空格(即,當[[:blank:]]太過於包含)時很有用。對於上述情況,-e標誌不是必需的。