Bashコンテキストから抽出したいです。すべてのテキスト異なる行にあるが全体を構成しない2つのパターン間で発生します。だから、特別にパターンが現れる行にテキストを印刷したいのですが、スタートパターンの後ろから始めて、ストップパターンの前で終わるようにします。
- たとえば、入力が次のような場合:
This is line 1 Something else Line 3
This
そしてパターンは3
- その後、希望の出力は次のようになります。
is line 1 Something else Line
答え1
grep
GNU、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
これは同じ効果を持ちますが、異なって表現されます。入力から目的の部分以外の部分を削除し、出力する前に目的の各部分の開始線と終了線を切り取ります。