grep -e
とgrep -E
。 grep manpage
から取得しました:
-E、-extended-regexp
PATTERNを拡張正規表現として解釈します(以下を参照)。
-e PATTERN、-regexp = PATTERN
PATTERNをパターンとして使用します。 –
で始まるパターンを保護するのに役立ちます上記の説明は私には意味がありません。
だから、誰かがそれを説明できますかexamples
を使用している私は、この2つの違いと、いつどのオプションを使用するかを教えてください。
PS:バージョン:grep(GNU grep)2.10
コメント
。
回答
-e
は、厳密には、照合するパターンを示すためのフラグです。 -E
は、特定の特殊文字をエスケープする必要があるかどうかを制御します。
man grep
は-E
もう少し:
Basic vs Extended Regular Expressions In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \). Traditional egrep did not support the { meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid { in grep -E patterns and should use [{] to match a literal {. GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification. For example, the command grep -E "{1" searches for the two-character string {1 instead of reporting a syntax error in the regular expression. POSIX.2 allows this behavior as an extension, but portable scripts should avoid it.
コメント
- これが理由です
echo "hello" | grep -o -e 'h|l'
|
が特別な意味を失い、echo "hello" | grep -o -E 'h|l'
希望の出力が得られます。 - はい。この場合、
echo "hello" | grep -o -e 'h' -e 'l'
は-E
を捨てたい場合に機能します。 -
grep -e -o 'h|l'
は文字通りh|l
と一致し、grep -e -o 'h\|l'
はh
またはl
および-Eを使用すると'逆になります - @ronnie it '残念ながら、"機能"がSEサイト間でフォローするには200以上の評判が必要です…
回答
また、grep -e
では、検索に複数の文字列を使用できます。"grep -e "abc" -e "def" -e "123"
は、次の3つの文字列のいずれかを検索します:abc
、def
および123
。
これは、\|
が表すgrep "abc\|def\|123"
と非常によく似ています。 or
の場合、ただしc読むのが少しわかりやすいでしょう。
grep -E
に関する最も重要な事実はすでにここで説明されているので、このトピックについて要約した内容を追加したいと思います。非常によく似た質問について: Bashで二重文字を検索するための正規表現
回答
以下を参照
/拡張
grepは、「basic」、「extended」、「perl」の3つの異なるバージョンの正規表現構文を理解します。 GNU grepでは、基本構文と拡張構文の間で使用可能な機能に違いはありません。他の実装では、基本的な正規表現はそれほど強力ではありません。以下の説明は、拡張正規表現に適用されます。基本的な正規表現の違いは後で要約されます。 Perl正規表現は追加機能を提供し、pcresyntax(3)およびpcrepattern(3)で文書化されていますが、すべてのシステムで使用できるとは限りません。
、もう一度。
GNU grepでは、基本構文と拡張構文で使用可能な機能に違いはありません
コメント
- 機能は基本と拡張で同じですが、構文が少し異なります。
(
、)
、|
などの正規表現の特殊文字はバックスラッシュでエスケープする必要があります基本的な正規表現では特別な意味がありますが、拡張ではありません(文字列リテラルとして扱われるためにエスケープする必要があります)
回答
-e
オプションについて詳しく説明します。 -e
はオプションであることがよくあります:
grep PATTERN
は
grep -e PATTERN
以前の回答とマニュアルページに記載されているように、複数の検索パターンがある場合、またはハイフン(-)で始まるパターンを保護する場合を除きます。
-e
の目的は、正規表現がダッシュで始まるときに明確にすることです。したがって、grep ---foo
はunrecognized option: ---foo
を提供しますが、正規表現ivのgrepにgrep -e ---foo
と言うことができます。 id = “1ef8b512ee”>