パターンが繰り返されるときにsedを使用して2つのパターン間でテキストを選択する

パターンが繰り返されるときにsedを使用して2つのパターン間でテキストを選択する

2つのモードからテキストを選択したいのですが、特定のパターンを繰り返すことができる場合次のように。

入力は次のとおりです。

Blalala
PAT1
'Omfoem From 
balanf PAT1 This is the
text that I want
to get PAT2: apples
Whatever: oranges

これが私が望む結果です:

This is the
text that I want
to get

私はこのスクリプトを試しました(私はOSXを使用しています):

gsed -e 's/PAT1/\nPAT1\n/' -e 's/PAT2/\nPAT2\n/' file1.txt | sed -n '/PAT1/,/PAT2/{//!p;}'

ただし、次のように出力されます。

'Omfoem From 
balanf 
PAT1
This is the
text that I want
to get 

この特別なケースでは、sed -n '/PAT1/,/PAT2/{//!p;}'それを2番目に適用すると正しい結果が得られます。

しかし、どのパターンが繰り返されるか(回数に関係なく)、パターンがまったく繰り返されないかなど、さまざまな状況で動作するスクリプトを探しています。

このような場合、PAT1とPAT2が互いに最も近いときにパターンPAT1とPAT2の間のテキストを抽出できるようにしたいです。

ベストアンサー1

1つのアプローチは次のとおりですPOSIX sed

$ sed -e '
   /PAT1/,/PAT2/!d
   H;/PAT1/h;/PAT2/!d;g
   s/PAT2.*//;s/.*PAT1//
' file

PAT1とPAT2が異なるラインにあると仮定します。

おすすめ記事