パターンの横または下にある単語を見つける必要があります。

パターンの横または下にある単語を見つける必要があります。

次の行を含むファイルがあります。

    .......... FROM ABCD_EXT
    .......... FROM HEG_EXT1 
.......... from
           xyz_EXT
.......... FROM abd_EXT2 
..........where QWT_EXT.SID=POI_EXT.GET
..........where QWT_EXT.SID=POI_GET.END_EXT

「FROM」(大文字と小文字を区別しない)の横または下にあり、_EXTで終わる単語をgrepします。

つまり、予想される出力は次のようになります。

ABCD_EXT 
xyz_EXT

編集:はい、同じ行に表示されるか、次の行に表示されるか、「from」の後の次の単語をgrepする必要があります。

私はこれを試して最初の部分を正しく得ました(同じ行)。

grep _EXT rt.sql |grep -i from|sed -e 's/_EXT/_EXT /g'|awk '{print $NF}'|grep _EXT

下の行から単語を取得するのは問題です。

ベストアンサー1

そしてpcregrep

pcregrep -Mo1 '(?<!\S)(?i:from)\s+(\S*_EXT)(?!\S)' < rt.sql
  • -MM複数行モードの場合
  • -o1最初のキャプチャoグループと一致するコンテンツを出力します。1
  • \sスペース文字(少なくともスペース、タブ、CR、およびLFを含む)と一致し、スペース以外の\S文字と一致します。
  • x+:1つ以上のxsと一致
  • x*:0個以上のxsと一致します。
  • (?i:from)from、、大文字と小文字を区別せず、と同じです[fF][rR][oO][mM]
  • (?<!\S): 空白でない場合、またはIOWの否定的な振り返り前提は、前の内容が空ではないということです。(スペースやトピックの先頭にも同じことが当てはまります)。
  • (?!\S):同じですが、後ろではなく前を見てください。 SQLなら、;許可したいかもしれません。(?![^\s;])

そのエントリがない場合は、pcregrep(の最初のエントリperl)を使用してファイル全体を延期できます。ppcregrep-0777

perl -l -0777 -ne 'print for /(?<!\S)(?i:from)\s+(\S*EXT)(?!\S)/g' < rt.sql

あるいは、GNUを使用してgrepPCREサポートで構築されている場合(これは-PPerlなどの正規表現を一致させるためのオプションを追加します):

grep -zPo '(?<!\S)(?i:from)\s+\K\S*EXT(?!\S)' < rt.sql | tr '\0' '\n'

GNUは最初のキャプチャグループ一致の印刷をgrepサポートしていないため、代わりに一致の内容全体を印刷しますが、一致で何をeepするかをマッチャーに伝えます。-o<n>n-o\KK

行ではなく NUL で区切られたレコードを処理するため、-z入力に NUL が含まれていないと仮定すると (通常は SQL とテキストの場合に該当する)、これはファイルの全内容を構成する 1 つのレコードになります。 Perlのように上記のフルルックパターン。ただし、出力レコード区切り文字もNULなので、tr各一致が別々の行になるように改行に変換する必要があります。

おすすめ記事