別のパターンを最初に一致させた後、2つのパターンの間にテキストを印刷する方法は?

別のパターンを最初に一致させた後、2つのパターンの間にテキストを印刷する方法は?

次の行を想像してみてください。

Some text with MATCH1_TEXT some other text and MATCH2_TEXT until MATCH3_TEXT

MATCH1_TEXTを含む行でのみ検索してテキストを検索したいです。〜サイ MATCH2_TEXTそしてMATCH3_TEXT

until上記の例では、私は(前後に空白文字を使用して)を取得したいと思います。~まで)。

答え1

たとえば、sedを使用すると

sed -n 's/^.*MATCH1_TEXT.*MATCH2_TEXT\(.*\)MATCH3_TEXT.*$/\1/p'

一致するテキストは、1 行に最大 1 回だけ順番に発生すると想定されます。

その行のどこでも発生する可能性がある場合は、MATCH1_TEXT問題を表示するもう1つの方法は問題のない行を無視することです。

sed -n '/MATCH1_TEXT/!d;s/.*MATCH2_TEXT\(.*\)MATCH3_TEXT.*$/\1/p'

MATCH2_TEXT複数回発生できる場合、たとえば入力は次のようになります。

 text MATCH1_TEXT stuff MATCH2_TEXT and MATCH2_TEXT until MATCH3_TEXT

だから質問はどの出力が必要か、untilそれともand MATCH2_TEXT until? MATCH3_TEXTの重複コピーにも同様の問題が適用されます。これは少し複雑なsedプログラムとして扱うことができます。たとえば、最も長い文字列を保持します。

sed -n '/MATCH1_TEXT/!d;/MATCH2_TEXT.*MATCH3_TEXT/!d;s/MATCH2_TEXT/\n/;s/^.*\n\(.*\)MATCH3_TEXT.*$/\1/p'

まず、不適切な行を拒否してから、MATCH2_TEXTの最初の項目を改行に変更し(行に改行がない)、改行とMATCH3_TEXTの間のテキストを選択するように機能します。

一部の言語(たとえば、およびperl)は、正規表現pythonで使用できる操作を拡張して「最小一致」を許可します。これはこのような場合に役立ちますが、必須ではありません。sed条件付き反復機能は正規表現よりも強力です。

答え2

「抽出」という言葉を見るたびに最初に思い浮かぶのは、ここでgrepが役に立つのでしょうか?

ここでは、まず関連行をgrepし、別のgrepに供給してから、match2とmatch3テキストの間にあるテキストを抽出します。これは連続的に複数のmatch2/3を抽出します。

$ grep MATCH1_TEXT file |\
  grep -oP '(?<=MATCH2_TEXT).*?(?=MATCH3_TEXT)' 

答え3

実際に必要なものを判断するにはサンプルデータが十分ではありませんが、サンプルが十分に標準であると仮定すると、

  1. MATCH1_TEXT、、、MATCH2_TEXTおよびMATCH3_TEXTすべてが1行にあります。
  2. MATCH1_TEXT常に前にMATCH2_TEXT
  3. MATCHn_TEXT内部と一致できるTHEMATCHn_TEXTS

perlその後、GNUへの単一の呼び出しを使用してgrep必要なデータを抽出できます。

grep -oP 'MATCH1_TEXT.*?MATCH2_TEXT\K.*?(?=MATCH3_TEXT)'

例のデータ行の場合、出力はuntil(先行と末尾の空白が1つあります)です。

関連情報