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が異なるラインにあると仮定します。