Como extrair texto entre dois padrões de correspondência para vários arquivos?

1

Eu tenho um arquivo binário e quero dividi-lo em arquivos separados pelos padrões START e END. Exemplo de entrada:

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

Blocos semelhantes (mas não o mesmo) podem repetir no arquivo de entrada

O resultado deve ser:

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

Bloquear por arquivo

Eu tentei awk '/{'\''StartOfFile'\'':/,/End}}/' file > export; e, em seguida, awk '/StartOfFile/{filename=NR".txt"}; {print >filename}' export para dividir em arquivos.

Mas a primeira e a última linha ainda têm caracteres indesejados. Como cortá-los? Chars e número deles desconhecidos

    
por Severgun 22.12.2017 / 13:41

2 respostas

1

Você pode fazer isso com um único awk abaixo:

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

Eu corri abaixo da entrada de amostra:

{'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

A saída foi / é como segue dividida em 3 arquivos:

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}}
    
por 22.12.2017 / 16:06
0

eu consegui isso abaixo sed um forro

 sed "s/.*{//g" example.txt | sed "s/}.*//2"| sed "s/}.*//g" | sed "1s/^/{/1"| sed "$ s/$/}/Ig"

saída

{'StartOfFile': sdflklfasdgjw723gsdf67asfr55a64
asduf hfna089FUAO
AHF78QAB6A SDFADSFGfh asiug6a8osiofh7qw8e6fgha
fq9w46tygvkabsdjfnhc :End}
    
por 22.12.2017 / 16:03