grepを使って正規表現で文字列を抽出するには?

grepを使って正規表現で文字列を抽出するには?

SQL.txtがあるとします。

select * from table1;
select a,b,c from table2 where a=1;

コマンドを使用してテーブル名をフィルタリングする方法cat SQL.txt|grep

私の予想結果は次のとおりです。

table1
table2

初めて指揮に触れてくれて、grep助けてくれてありがとう。ありがとうございます。

修正する

grep私が望むのは、コマンドに正規表現を適用する方法を知ることです。

この場合、正規表現を作成できますfrom (.*?)。問題は、grepで正規表現を使用する方法がわからないことです。

ベストアンサー1

Grep はパターンとファイルを引数として使用します。説明したようにman grep

GREP(1)                          User Commands                         GREP(1)

NAME
       grep, egrep, fgrep - print lines that match patterns

SYNOPSIS
       grep [OPTION...] PATTERNS [FILE...]
       grep [OPTION...] -e PATTERNS ... [FILE...]
       grep [OPTION...] -f PATTERN_FILE ... [FILE...]

DESCRIPTION
       grep  searches  for  PATTERNS  in  each  FILE.  PATTERNS is one or more
       patterns separated by newline characters, and  grep  prints  each  line
       that  matches a pattern.  Typically PATTERNS should be quoted when grep
       is used in a shell command.

したがって、一般的な形式はですgrep 'regex' file。したがって、正規表現の例を使用するには、次のようにします。

grep 'from (.*?)' file 

grepしかし、これはうまくいきません。基本正規表現(BRE)は括弧を特殊文字1として扱わず、貪欲でない(最短一致検索)演算子を理解していません*?。あなたが本当に欲しいものは:

grep 'from [^[:blank:]]' file 

BRE文字クラスを使用し[[:blank:]]ますが、否定的な^()と一緒に使用され、[^[:blank:]]空白以外の文字と一致します。ただし、grep完全一致が返されるので、これはまだ必要ではありません。ワイヤー一致する線の部分だけではありません。

grepGNU(Linuxのデフォルト)がある場合は、一致する部分のみを返すように-o選択できます。grep

$ grep -o 'from [^[:blank:]]*' file 
from table1;
from table2

もちろん、これはまだ必要なものではありません。追加from、スペース、末尾があります。;繰り返しますが、GNUがある場合は、grep以下をサポートするPCRE(Perl Compatible Regular Expressions)を使用できます。周りを見てください:

$ grep -oP '(?<=from )\w+' file 
table1
table2

ここでは、一致する部品のみを返すように-o指示し、PCREサポートを有効にします。これは…grep-P(?<=from )アクティブバックビュー「前の部分が一致する場合のみ、次の部分と一致from」を意味します。最後に、「単語文字」(文字、数字、および(Unicodeを使用している場合はその他))\wと一致する特別なPCREクラスがあります。_説明したようにman perlre

\w        [3]  Match a "word" character (alphanumeric plus "_", plus
               other connector punctuation chars plus Unicode
               marks)

PCREには素晴らしい\K機能もあります。これは振り返るのと似ていますが、基本的には「ここに一致するものを無視します」という意味です。これを使用して、上記の正規表現を次のように単純化できます。

$ grep -oP 'from \K\w+' file 
table1
table2

おすすめ記事