15

test.txtフォーマットされた電話番号がいくつか含まれているファイルがあります。grep電話番号を含む行を見つけるために使用しようとしています。

それはgrep -e "[0-9]{3}-[0-9]{3}-[0-9]{4}" test.txt機能せず、結果が得られないようです。しかし、grep -E "[0-9]{3}-[0-9]{3}-[0-9]{4}" test.txt動作します。したがって、これら2つのオプションの違いは何だろうか。

によるとman grep

-E, --extended-regexp pattern を拡張正規表現として解釈します (つまり、grep を egrep として動作させます)。

-e pattern, --regexp=pattern 入力の検索中に使用されるパターンを指定します。指定されたパターンのいずれかに一致する場合、入力行が選択されます。このオプションは、複数の -e オプションを使用して複数のパターンを指定する場合、またはパターンがダッシュ (`-') で始まる場合に最も役立ちます。

しかし、私はそれをよく理解していません。拡張正規表現とは何ですか?

4

3 に答える 3

11

おっしゃったように、grep -Eは拡張正規表現用ですが、は基本正規表現用です。マニュアルページから:-e

編集: ジョナサンが以下で指摘したように、grep -e「次の引数が一致する正規表現 (の 1 つ) であることを指定します。」

基本正規表現と拡張正規表現

基本的な正規表現では、メタ文字?, +, {, |,は特別な意味()失います。代わりに\?、バックスラッシュ付きの 、、、、、および を使用してください 。\+\{\|\(\)

従来型は メタ文字を egrepサポートしていませんでしたが、一部の 実装では代わりにサポートされているため、移植可能なスクリプトはin パターンを避け、リテラルの一致に使用する必要があります。{egrep\{{grep -E[{]{

GNU は、それが無効な間隔指定の開始である場合、それが特別grep -Eではないと想定することによって、従来の使用法をサポートしようとします。{たとえば、このコマンド は 、正規表現の構文エラーを報告する代わりにgrep -E '{1' 、2 文字の文字列を検索し ます。{1POSIX.2 ではこの動作を拡張として許可していますが、移植可能なスクリプトではこれを避ける必要があります。

ただし、man ページは非常に簡潔なので、詳細については、次のリンクを参照してください。

http://www.regular-expressions.info/posix.html

ただし、メタ文字に関するマンページの部分では{、違いに関して見ていることについて具体的に説明しています。

grep -e "[0-9]{3}-[0-9]{3}-[0-9]{4}" 

{期待どおりにキャラクターを扱っていないため、機能しません。一方

grep -E "[0-9]{3}-[0-9]{3}-[0-9]{4}" 

それは拡張されたgrepバージョン、またはegrepたとえばバージョンであるためです。

于 2013-06-16T04:54:27.783 に答える
4

簡単なテストを次に示します。

$ cat file
apple is a fruit
so is orange
but onion is not

$ grep -e 'but' -e 'fruit' file #Allows you to pass multiple patterns explicitly
apple is a fruit
but onion is not

$ grep -E 'is (a|not)' file #Allows you to use extended regular expressions like ?, +, | etc
apple is a fruit
but onion is not
于 2013-06-16T04:58:38.517 に答える
2

-eオプション toはgrep、単に次の引数が正規表現であることを示しています。したがって:

grep -e 'some.*thing' -r -l .

は、現在のディレクトリとそのすべてのサブディレクトリ内のすべてのファイルの行を検索しsomeます。thing同じことは、次の方法で実現できます。

grep -r -l 'some.*thing' .

getopt()(Linux では、環境で POSIXLY_CORRECT を設定しない限り、オプションを並べ替えるGNU の動作によって状況が混乱するため、次のコマンドを実行することもできます。

grep 'some.*thing' -r -l .

同じ結果が得られます。POSIX および GNU を使用しない他のシステムではgetopt()、オプションは引数の前に置く必要があり、は というファイルとというgrepファイルを探します。)-r-l

この-Eオプションは、正規表現を'basic' から 'extended' に変更します。以下で使用できます-e

grep    -e "[0-9]{3}-[0-9]{3}-[0-9]{4}" test.txt
grep -E -e "[0-9]{3}-[0-9]{3}-[0-9]{4}" test.txt

ERE オプションは、多かれ少なかれegrepコマンドによって認識されていたのと同じ正規表現を意味し、もはや POSIX の一部ではありません ( と に置き換えられましgrep -Efgrep) grep -F

于 2013-06-16T05:06:50.280 に答える