次の行を想像してみてください。
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
実際に必要なものを判断するにはサンプルデータが十分ではありませんが、サンプルが十分に標準であると仮定すると、
MATCH1_TEXT
、、、MATCH2_TEXT
およびMATCH3_TEXT
すべてが1行にあります。MATCH1_TEXT
常に前にMATCH2_TEXT
MATCHn_TEXT
内部と一致できるTHEMATCHn_TEXTS
perl
その後、GNUへの単一の呼び出しを使用してgrep
必要なデータを抽出できます。
grep -oP 'MATCH1_TEXT.*?MATCH2_TEXT\K.*?(?=MATCH3_TEXT)'
例のデータ行の場合、出力はuntil
(先行と末尾の空白が1つあります)です。