次のコマンドは2つの方法で作成できます。
# using extended regex
$ echo foobar | sed -E 's/(foo)(bar)/\2\1/'
barfoo
そして:
# using backslashes
$ echo foobar | sed 's/\(foo\)\(bar\)/\2\1/'
barfoo
バックスラッシュを使用すると、このコマンドが拡張正規表現よりも移植性が高いことを意味しますか?
ベストアンサー1
はい
これ現在のPOSIX規格sed
-E
拡張正規表現(ERE)を有効にするフラグが指定されていません。これだけでも、基本正規表現(BRE)形式が's/\(foo\)\(bar\)/\2\1/'
最も移植性が高いという結論を下すのに十分です。
だが、その基準が-E
含まれているとしても──sed
それになります-、これ正規表現文書 EREに逆参照が定義されていません。したがって、BRE \(...\) == ERE (...)
接続自体はGNU拡張であり、すべてのプログラムでサポートされるという保証はありません。POSIXクエリたとえば、-E
フラグが含まれていますが、各フラグは
grep 'ee*'
grep -E 'e+'
grep '\(.\)\1'
遵守し、
grep -E '(.)\1'
いいえ。
同様に、レポート特にBSDは拡張に従わないと述べています。
[FreeBSDから]
sed -E '/(.)\1/d'
他の文字を含む行を削除します。1
GNUはsed
これを逆参照として扱い、2つの同じで隣接する文字を含む行を削除します。