ファイルのコンテキストで文字列の複数のインスタンスを検索する

ファイルのコンテキストで文字列の複数のインスタンスを検索する

MySQLダンプファイルがありますが、ほとんどがINSERT文です。特定のテーブルのフィールドに文字列 "media"のインスタンスをgrepし、+/-〜10個のコンテキスト文字を含めたいと思います。文字列は列値に複数回現れることがあります。どうすればいいですか?

ソースは非常に大きなSQLダンプファイルです(簡潔さのために厳密にカットする必要がありました)。

INSERT...334,'field_media_intro_image','image','image'...);
INSERT...g__vieg__view_mode__media_original attr__format....ategies that are immediately actionable for the task...);

見たい

ield_media_intr
ode__media_orig, re immediately 

上の最初の行は、最初の一致行の文字列 "media"のインスタンスであり、2行目は、次の一致行の文字列 "media"の2つのインスタンスを示しています。どちらも、文字列の先頭と末尾に5つのコンテキスト文字を表示します。カンマは区切り文字として機能します。

ベストアンサー1

GNU grepコンテキストは次の行を介して取得できます(-A LINESコンテキストの場合)。後ろに-B LINESコンテキスト用今後-C LINESコンテキスト前後)、水平コンテキストフラグはありません。ただし、正規表現を使用してこれを実行できます。

grep -Eo '.{0,10}media.{0,10}'

-E使用拡張正規表現(ERE)、同様の構文を許可します.{0,10}(すべての文字と0〜10回一致)。 GNU grepを-o表示ただ1行に1回ずつ一致するコンテンツです。 )

貪欲

「メディア」という単語の一部のコピーは、キャプチャされたコンテンツと似ている可能性があるため、これが包括的なリストではないことに注意してください。たとえば、

$ echo 123 media 12345 media 123456789 media 12 |grep -Eo '.{0,10}media.{0,10}'
123 media 12345 med
234567890 media 123

あなたは得る部分「メディア」の3つのインスタンスはすべてありますが、1つのインスタンスが別のインスタンス部分と10文字以内であるため、インスタンスの対応する部分のみが表示されます。

GNU grep コンパイルがある場合図書館、これらのワイルドカードが次のようになることがわかります。欲よりも怠惰:

$ echo 123 media 12345 media 123456789 media 12 |grep -Po '.{0,10}?media.{0,10}?'
123 media
 12345 media
234567890 media

この-PフラグはPerl互換正規表現(PCRE)評価.

遅延評価(「貪欲な評価」とも呼ばれる)は、可能な限り10文字を消費して追加の一致を制限するのではなく、1つの一致が他の一致を妨げないようにすることを目的としています。

ご使用のバージョンがgrepサポートされていない場合は、以下を使用できます。-P-operl

$ echo 123 media 123 media 123456789 media 12 |perl -ne \
    'while (/(.{0,10}?media.{0,10}?)/g) { print "$1\n"; }'
123 media
 12345 media
234567890 media

これは、後で一致するテキストを参照できるように一致グループを含めるように正規表現をわずかに変更します。それ以外の場合は、各一致を繰り返し(g最初の一致ではなくグローバル一致)、改行文字で一致を印刷します。

GNU対POSIX grep

GNU grep多くの機能が追加されましたPOSIX 標準 grep。この回答に関して-A LINES(コンテキストライン以降)、-B LINES(コンテキストライン第二以前)、-C LINES(ライン前後文脈)、-o(表示ああ一致のみ)と-P(使用CRE)はGNU grepで使用できますが、他のgrep実装では想定できません。 BSD grep以外はすべてサポートさ-Pれます。GNUのパフォーマンス最適化

GNUコマンドとBSDgrepコマンドの両方がサポートされてい--colorます-o

 

最後の注意:質問に対するコメントはでは機能しませんが、ほとんどどこでも機能しない構文を.{,5}使用してください。にゼロを明示的に含めるのではなく、この形式を使用することはお勧めできません。grep -Egrep -Pperl.{0,5}

おすすめ記事