Sed

sed 可移植性:擴展正則表達式與反斜杠

  • February 8, 2021

我們可以通過兩種方式編寫下一個命令:

# 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後面有其他字元的行。

而 GNUsed會將其視為反向引用並刪除包含兩個相等且相鄰的字元的行。

引用自:https://unix.stackexchange.com/questions/633147