Unixの拡張正規表現は互換性がありますか?

Unixの拡張正規表現は互換性がありますか?

Unixツールの正規表現は完全に互換性がありますか?

たとえば、私がgrep -oE "\$text *\( *([^)]) *\)"使用している場合、私が受け取った正確な部品の交換は保証されますかsed -E "s/\$text *\( *([^)]) *\)/replacement/g"?これはすべての正規表現に拡張されますか?

どれくらいうまく一致しますか(または一致しません)?

ところで、私の友人のsedはスイッチを表示しませんが、まだ動作し、-E正規表現スイッチが-r-Eそして-r 同じですか?

ベストアンサー1

GNU grep および GNU sed のマニュアルには、-E拡張正規表現の使用に関するオプションの両方が記載されています。

grep:

-E --extended-regexp
パターンを拡張正規表現(ERE)として解釈します。 (-E は POSIX で指定されます.)

sed:

-E -r --regexp-extended
デフォルトの正規表現の代わりに拡張正規表現を使用してください。

-E(以前はサポートされているが文書化されていないと言われています。)

どちらもサポートしている正規表現の正確な定義を確認できますが、あなたの定義は十分に標準的なようです。実際、これはデフォルトの正規表現と同じように見えます\$text *( *[^)] *)sed代替エントリがキャプチャグループを使用しない限り)。

ただし、書かれているように(二重引用符で囲む)、何も一致しません。バックスラッシュはシェルのドル記号を超えているため、パラメータ拡張として扱われません。ただし、grepまたはfor行の終わりで始まる正規表現を見ることもsedできます。$行末の後には何も来ることができないため、パターンは一致しません。 2つ以上のバックスラッシュを追加するか、二重引用符の代わりに一重引用符を使用する必要があります。

おすすめ記事