sed移植性:拡張正規表現とバックスラッシュ

sed移植性:拡張正規表現とバックスラッシュ

次のコマンドは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つの同じで隣接する文字を含む行を削除します。

答え2

sed -E拡張正規表現(ERE)を使用することを意味し、対応するフラグがない場合はデフォルトの正規表現(BRE)を使用します。

すべてのsedバージョンが拡張正規表現を処理できるわけではないため、移植性は優れていますが、バックスラッシュを使用したためではありません。これは正常ですBRE

バラよりBREとERE

答え3

GNUマニュアル答える:

5.2 基本(BRE)および拡張(ERE)正規表現

基本正規表現と拡張正規表現は、パターンを指定する構文の2つのバリエーションです。 BRE(基本正規表現)構文は、sed(およびgrepでも同様)の基本構文です。拡張正規表現 (ERE) 構文を有効にするには、POSIX 指定の -E オプション (-r, --regexp-extended) を使用します。

GNU sedのデフォルト正規表現と拡張正規表現の唯一の違いは、「?」、「+」、括弧、中括弧(「{}」)、および「|」などの一部の特殊文字の動作です。

基本(BRE)構文を使用して、これらの文字は、バックスラッシュ('\')プレフィックスが付いていない限り、特別な意味はありません。拡張(ERE)構文では、その逆が適用されます。これらの文字は、バックスラッシュ('\')プレフィックスが付いていない限り特別です。

関連情報