grep
デフォルトでは、これらはsed
すべて「基本正規表現」(「BRE」)を使用するものとして説明されます。 BREはこれをよく説明しています。ここ。
ただし、次の出力を考慮してください。
# echo ' aaaaa ' | grep '\(aaaaa\|bbbbb\)'
aaaaa
# echo ' aaaaa ' | sed '/\(aaaaa\|bbbbb\)/ s/ /_/g'
aaaaa
最初のコマンドでは、構文\( ... \| ... \)
は明確な行動as (X OR Y)
、出力が通過するためですgrep
。
2番目のコマンドで\( ... \| ... \)
は、構文は何も行っていないようですas (X OR Y)
、空白が下線に変わらないからです。
(逆に、両方\+
「複数回繰り返される」と認識されるコマンド)
どうしたの? FreeBSDに2つのBREがあるように見えるのはなぜですか?そのうちの1つは構文を認識し、もう1つは認識しませんか?
より深い問題は、多くのプロジェクトがBREを使用して他のUNIXシリーズシステムへの移植性を提供することを望んでいることです。しかし、これはBREでさえもプラットフォーム間で同じである可能性がないことを示しています。以内に個人的なプラットフォーム。ああ?
ベストアンサー1
リンクされた記事の説明が正しくありません。
実際のPOSIX定義指摘した:
エスケープされていない<バックスラッシュ>( '\')の前にある一般文字の解釈は定義されていません。[
(){}
、数字、括弧内の表現]
一般文字は、.[^$*
BRE特殊文字とバックスラッシュ自体を除くすべての文字として定義されます。
したがって、そのページの宣言とは異なり、\+
BREは定義されていません\|
。
+
|
一部の正規表現実装では、これをERE、特にGNUと同じように定義します。ただし、それに依存してはならず、定義された機能に固執する必要があります。
もちろん、ここでの問題は、EREシフト演算子が|
BREに存在せず、EREに対応する演算子が+
非常に醜いということです\{1,\}
。したがって、代わりにEREを使用することをお勧めします。