別のパターンを最初に一致させた後、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条件付き反復機能は正規表現よりも強力です。

おすすめ記事