次の行を想像してみてください。
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
条件付き反復機能は正規表現よりも強力です。