我需要運行正則表達式來匹配部分字符串。在OS X上我會做:sed擴展正則表達式的替代方案
echo "$string" | sed -E 's/blah(.*)blah/\1/g'
不過,這款採用sed
不與其他平臺,其中許多將調用使用sed -r
相同的命令兼容。
所以我正在尋找的是一個很好的方法來檢測使用哪個選項,或者sed
的一個廣泛可用(和兼容)替代方法,我可以嘗試做同樣的事情(檢索部分字符串一種模式)。
我需要運行正則表達式來匹配部分字符串。在OS X上我會做:sed擴展正則表達式的替代方案
echo "$string" | sed -E 's/blah(.*)blah/\1/g'
不過,這款採用sed
不與其他平臺,其中許多將調用使用sed -r
相同的命令兼容。
所以我正在尋找的是一個很好的方法來檢測使用哪個選項,或者sed
的一個廣泛可用(和兼容)替代方法,我可以嘗試做同樣的事情(檢索部分字符串一種模式)。
還有其他的選擇,比如awk,perl,tr甚至純粹的bash。這取決於你想要做什麼。
但是對於你的情況,你並不需要sed的特殊正則表達式標誌-E
。你可以這樣做:
sed 's/blah\(.*\)blah/\1/g'
使其與其他平臺上的sed兼容。
到目前爲止使用sed
最好的解決方法是使用便攜式(POSIX)基本正則表達式等效,這將在所有平臺上工作:
echo "$string" | sed -e 's/blah\(.*\)blah/\1/g'
這-e
表示-script如下sed
;它可以被省略。
如果不成功,Perl部分替代了sed
(還有一個程序s2p
將sed
腳本轉換爲Perl腳本)。
perl -e 'foreach (@ARGV) { s/blah(.*)blah/$1/; print "$_\n"; }' "$string"
這確實令人難以置信的煩人。我做的是這樣的:
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
是擴展正則表達式的標誌,如果有的話)。
感謝您的回覆!在某些方面,這是對我提出的問題最直接的回答,不管怎麼說都值得了解,但我認爲@ anubhava的答案就是我應該在我的案例中實際使用的答案,因此我將其標記爲答案。雖然謝謝! – Haravikk
真的嗎?該死的!看起來我還有很多其他腳本需要糾正!雖然這不是對我提出的問題的最直接回應,但我認爲這是最正確的,因爲我(錯誤地)認爲我需要特殊的正則表達式來使用子模式,但沒有意識到你剛剛逃脫了它們!謝謝! – Haravikk
非常歡迎。 – anubhava