Problemas com a sintaxe de Sed

1

Estou modificando arquivos PCL / PS brutos (mistos) e, por algum motivo, não consigo acertar minha sintaxe Sed para o verdadeiro começo que quero que ela pegue. Aqui está um exemplo de saída do comando strings:

*c50B
*c0P
&f1X
&f7y4X
%-12345X%!PS-Adobe-3.0 EPSF-3.0 <------Sed doesn't work for this pattern
%%Creator: tiff2ps  <----Sed works for this pattern
[data...]
%%EOF

Aqui está meu comando sed que funciona:

sed -n '/%%Creator/,/%%EOF/p'

Mas quero que comece com% -12345X%:

sed -n '/%-12345X%/,/%%EOF/p'

Quando eu faço o último comando, ele apenas exibe o arquivo inteiro. Nenhuma combinação dessa linha funciona. Agora, estou visualizando o arquivo de impressão bruto com 'strings', será que essa linha está codificada de uma maneira que o sed não consegue entender? Alguma ideia de como trabalhar com isso?

Editado para adicionar:

Eu tenho certeza que isso tem a ver com a codificação de PCL e escapes de linha. O arquivo vai de PCL para PS e não cria a primeira mensagem de PS em sua própria linha. A saída do gato é assim:

*c50BESC*c0PESC&f1XESC&f7y4XESC%-12345X%!PS-Adobe-3.0 EPSF-3.0
%%Creator: tiff2ps
    
por RyanH 31.03.2015 / 19:17

1 resposta

2

Meu palpite é que sed está fazendo exatamente o que você está mandando: Imprima a primeira "linha" que contém %-12345X% . Mas como isso não é um arquivo ASCII, mas um arquivo PCL ou PDF com todos os tipos de bytes binários - e não há uma nova linha apropriada para falar, até ficar na frente de "%% Creator:" - ele imprime a coisa toda . Lembre-se, sed imprime a "linha" correspondente. O que você está pedindo para fazer, eu acho, é imprimir "começando nesta string".

Se você deseja obter um arquivo que não é garantido como orientado à linha (como este), você terá que usar uma técnica que não dependa de ferramentas orientadas à linha. Isso pode ajudar: como despejar parte de um arquivo binário . É um pouco mais complicado, mas suas cordas são bastante distintas, então isso deve funcionar.

Hmm ... só tive uma ideia - talvez isso funcionasse. Exclui tudo na mesma "linha" que está na frente do% -12345X%, exceto pela própria string. Em seguida, imprime tudo dessa linha até o final do arquivo. Eu não tentei isso, mas é assim que eu abordaria:

sed -n -e '/%-12345X%/s/.*%-12345X%/%-12345X%/' -e '/%-12345X%/,/%%EOF/p'

Ou melhor ainda:

STR="%-12345X%"
sed -n -e "/${STR}/s/.*${STR}/${STR}/" -e "/${STR}/,/%%EOF/p"
    
por 31.03.2015 / 20:00