2013-07-08 76 views
1

我需要運行正則表達式來匹配部分字符串。在OS X上我會做:sed擴展正則表達式的替代方案

echo "$string" | sed -E 's/blah(.*)blah/\1/g' 

不過,這款採用sed不與其他平臺,其中許多將調用使用sed -r相同的命令兼容。

所以我正在尋找的是一個很好的方法來檢測使用哪個選項,或者sed的一個廣泛可用(和兼容)替代方法,我可以嘗試做同樣的事情(檢索部分字符串一種模式)。

回答

4

還有其他的選擇,比如awk,perl,tr甚至純粹的bash。這取決於你想要做什麼。

但是對於你的情況,你並不需要sed的特殊正則表達式標誌-E。你可以這樣做:

sed 's/blah\(.*\)blah/\1/g' 

使其與其他平臺上的sed兼容。

+0

真的嗎?該死的!看起來我還有很多其他腳本需要糾正!雖然這不是對我提出的問題的最直接回應,但我認爲這是最正確的,因爲我(錯誤地)認爲我需要特殊的正則表達式來使用子模式,但沒有意識到你剛剛逃脫了它們!謝謝! – Haravikk

+0

非常歡迎。 – anubhava

1

到目前爲止使用sed最好的解決方法是使用便攜式(POSIX)基本正則表達式等效,這將在所有平臺上工作:

echo "$string" | sed -e 's/blah\(.*\)blah/\1/g' 

-e表示-script如下sed;它可以被省略。

如果不成功,Perl部分替代了sed(還有一個程序s2psed腳本轉換爲Perl腳本)。

perl -e 'foreach (@ARGV) { s/blah(.*)blah/$1/; print "$_\n"; }' "$string" 
2

這確實令人難以置信的煩人。我做的是這樣的:

SED_EXTENDED_REGEXP_FLAG=-r 
case $(uname) 
in 
    *BSD) SED_EXTENDED_REGEXP_FLAG=-E ;; 
    Darwin) SED_EXTENDED_REGEXP_FLAG=-E ;; 
esac 

echo "$string" | sed $SED_EXTENDED_REGEXP_FLAG 's/blah(.*)blah/\1/g' 

這是關閉我的頭頂,所以如果shell腳本語法是有點關閉的道歉。

這假設任何不是BSD或OS X的平臺都有GNU sed(或者其他的sed,其中-r是擴展正則表達式的標誌,如果有的話)。

+0

感謝您的回覆!在某些方面,這是對我提出的問題最直接的回答,不管怎麼說都值得了解,但我認爲@ anubhava的答案就是我應該在我的案例中實際使用的答案,因此我將其標記爲答案。雖然謝謝! – Haravikk