2つのパターン間のすべてのテキスト(パターンが表示される行のテキストを含む)をどのように抽出しますか?

2つのパターン間のすべてのテキスト(パターンが表示される行のテキストを含む)をどのように抽出しますか?

Bashコンテキストから抽出したいです。すべてのテキスト異なる行にあるが全体を構成しない2つのパターン間で発生します。だから、特別にパターンが現れる行にテキストを印刷したいのですが、スタートパターンの後ろから始めて、ストップパターンの前で終わるようにします。

  • たとえば、入力が次のような場合:
    This is line 1
    Something else
    Line 3
    
  • Thisそしてパターンは3
  • その後、希望の出力は次のようになります。
    is line 1
    Something else
    Line
    

答え1

grepGNU、Lookbehind (?<=This )、およびLookaheadを使用する(?= 3)

grep -Poz '(?<=This )(.|\n)*(?= 3)' file

出力:

1号線です。
その他
ワイヤー

参照:man grepスタックオーバーフロー正規表現に関するよくある質問

答え2

Perlが構造に来ます:

perl -0777 -ne 'BEGIN { ($f, $t) = (shift, shift) }
                /$f\s*(.*)\s*$t/s and print $1
               ' This 3 input.txt
  • -0777ファイル全体をメモリに読み込んで処理することを意味する「フルルックモード」をオンにします。
  • -nコードによる入力を処理します。
  • 最初の最初の2つのパラメータは、$ fおよび$ t変数に格納されます。
  • 入力に2つのパターン間の項目が含まれている場合、$ 1に保存され印刷されます。

答え3

拡張正規表現モードのGNU sed

sed -E '
  /This/,/3/ s/(^|\s+)(This|3)(\s+|$)//
' file

検索語 This が他のテキストには表示されないとします。

答え4

そしてsed

$ cat file
This is line 1
This is Something else
Line 3
Line 33
This is more
data here
The 3rd bumblebee was never seen
$ sed -n '/.*This /,/ 3.*/ { s///; p; }' file
is line 1
This is Something else
Line
is more
data here
The

sed入力ファイルを出力するスクリプト部分を編集します。各セクションは開始パターンに一致する行で始まり.*This、終了パターンに一致する行で終わります3.*。さらに、スクリプトは開始行から開始パターンに一致する部分文字列を削除し、終了行から終了パターンに一致する部分文字列を削除します。

または、

$ sed -e '/.*This /,/ 3.*/!d' -e 's///' file
is line 1
This is Something else
Line
is more
data here
The

これは同じ効果を持ちますが、異なって表現されます。入力から目的の部分以外の部分を削除し、出力する前に目的の各部分の開始線と終了線を切り取ります。

関連情報