一致する2つのパターン間のテキストを複数のファイルに抽出するには?

一致する2つのパターン間のテキストを複数のファイルに抽出するには?

バイナリファイルがありますが、STARTパターンとENDパターンで別々のファイルに分割したいと思います。入力例:

yut786y= 3&*%^#$%fsd{'StartOfFile': sdflklfasdgjw723gsdf67asfr55a64
asduf hfna089FUAO
AHF78QAB6A SDFADSFGfh asiug6a8osiofh7qw8e6fgha
fq9w46tygvkabsdjfnhc :End}}fji8yEBFBOA NFmc

同様のブロック(同じではありません)を入力ファイルで繰り返すことができます。

結果は次のとおりです。

{'StartOfFile': sdflklfasdgjw723gsdf67asfr55a64
asduf hfna089FUAO
AHF78QAB6A SDFADSFGfh asiug6a8osiofh7qw8e6fgha
fq9w46tygvkabsdjfnhc :End}}

ファイルブロックあたり

awk '/{'\''StartOfFile'\'':/,/End}}/' file > export; その後、awk '/StartOfFile/{filename=NR".txt"}; {print >filename}' exportファイルに分割しようとしました。

しかし、最初の行と最後の行にはまだ望ましくない文字があります。どうやって切るの?登場人物と数量不明

答え1

以下のように単一のawkを使用してこれを実行できます。

awk -v RS="{'StartOfFile'" 'NR>1{sub(/End}}.*/,"End}}"); print RS$0>NR-1".txt"}' infile

次のサンプル入力を実行しました。

{'StartOfFile': Unix.stackexchange.com End}}
yut786y= 3&*%^#$%fsd{'StartOfFile': sdflklfasdgjw723gsdf67asfr55a64
asduf hfna089FUAO
AHF78QAB6A SDFADSFGfh asiug6a8osiofh7qw8e6fgha
fq9w46tygvkabsdjfnhc :End}}fji8yEBFBOA NFmc

72 YOY398Y 9Y9&y&*t*#&y(*yH{'StartOfFile':uih4yUH OG8YG*^t&^t*&o y(yt&*wt*&(0
jfhi hwuw hfuweh012r892u 098Y&*T*#^98 yHO
OFUH idueg&*#trt& goe
ouh#ye(e#y( geiyfgefyg #O WIBCJHvKKJSLSDOLSL*6
asds:End}}JKDSHFLAJHFLAJSDHFLIAUHFILU7869786

出力は次のようになり、3つのファイルに分けられます。

1.txt

{'StartOfFile': Unix.stackexchange.com End}}

2.txt

{'StartOfFile': sdflklfasdgjw723gsdf67asfr55a64
asduf hfna089FUAO
AHF78QAB6A SDFADSFGfh asiug6a8osiofh7qw8e6fgha
fq9w46tygvkabsdjfnhc :End}}

3.txt

{'StartOfFile':uih4yUH OG8YG*^t&^t*&o y(yt&*wt*&(0
jfhi hwuw hfuweh012r892u 098Y&*T*#^98 yHO
OFUH idueg&*#trt& goe
ouh#ye(e#y( geiyfgefyg #O WIBCJHvKKJSLSDOLSL*6
asds:End}}

関連情報