Sed
sed 可移植性:擴展正則表達式與反斜杠
我們可以通過兩種方式編寫下一個命令:
# using extended regex $ echo foobar | sed -E 's/(foo)(bar)/\2\1/' barfoo
和:
# using backslashes $ echo foobar | sed 's/\(foo\)\(bar\)/\2\1/' barfoo
使用反斜杠意味著該命令比擴展的正則表達式更便攜?
是的
目前的POSIX 標準
sed
沒有指定-E
啟用擴展正則表達式 (ERE) 的標誌。僅此一項就足以得出基本正則表達式 (BRE) 形式's/\(foo\)\(bar\)/\2\1/'
是最可移植的結論。然而,即使是
-E
被包含sed
的標準——而且它將是——,正則表達式文件 並沒有在 ERE 中定義反向引用,因此該BRE \(...\) == ERE (...)
關聯本身是一個 GNU 擴展,並且不能保證被所有程序支持。例如,POSIX Grep-E
包含該標誌,但其中的每一個grep 'ee*' grep -E 'e+' grep '\(.\)\1'
是合規的,
grep -E '(.)\1'
不是。
同樣,有報告具體說明 BSD 不遵循擴展:
$$ In FreeBSD $$
sed -E '/(.)\1/d'
刪除1
後面有其他字元的行。而 GNU
sed
會將其視為反向引用並刪除包含兩個相等且相鄰的字元的行。