Bash remove todos os caracteres após o padrão com awk

3

Eu tenho um arquivo de entrada no seguinte formato:

something here
somethingElseHere^[%-somestuff here
^[%-somestuff here

Observe que ^[ é o caractere de escape \x1b .

Então, o que estou tentando fazer é excluir tudo no arquivo após a primeira ocorrência de ^[ , em um script bash, então devo acabar com algo assim:

something here
somethingElseHere

Minha solução foi: awk -F "\x1b" {'print $1'} , mas isso é uma saída:

something here
somethingElseHere
(empty line here)

Então, está adicionando uma linha extra vazia após a última. Ainda assim, se eu excluir manualmente, recebo um byte extra. Fiz um programa C ++ que lê o arquivo até o caractere \x1b e grava todos os caracteres lidos em um arquivo separado, mas com o AWK, depois de excluir a linha extra, ainda consigo 1 byte a mais do que fazê-lo com C ++.

Editar:

talvez seja o caractere EOL adicionado ao usar o AWK? Eu não o adiciono ao usar o programa C ++.

ATUALIZAÇÃO:

Acabei de experimentar alguns dos comandos, e a maioria deles funciona se eu os abrir em vi , mas eles ainda têm um byte extra e não consigo descobrir de onde vem.

$hexdump -x file1
0000000    4329    706f    7279    6769    7468    6328    2029    3931
0000010    3939    4d20    6369    6f72    6f73    7466    4320    726f
0000020    6f70    6172    6974    6e6f    610a    6362    6564    6766
0000030    6968    6b6a    6d6c    6f6e    7170    7372    7574    7776
0000040    7978    534d    5020    4c43    4c58    6f46    746e    3020
0000050    3130    a8f8    4955    0a42                                
0000058

$hexdump -x file2
0000000    4329    706f    7279    6769    7468    6328    2029    3931
0000010    3939    4d20    6369    6f72    6f73    7466    4320    726f
0000020    6f70    6172    6974    6e6f    610a    6362    6564    6766
0000030    6968    6b6a    6d6c    6f6e    7170    7372    7574    7776
0000040    7978    534d    5020    4c43    4c58    6f46    746e    3020
0000050    3130    a8f8    4955    0042                                
0000057

No arquivo1, que é o que estou gerando com o bash, ele adiciona um 0x0a (caractere de nova linha) extra.

    
por deuseux12 05.01.2017 / 09:52

1 resposta

3

Aqui está uma solução com o GNU sed :

sed -z 's/\x1b.*//'

E abaixo está uma solução com awk , com base nos comentários do OP:

awk -F '\x1b' 'NF > 1 { printf "%s", $1; exit } 1'

Você deve ter uma boa razão para não querer a nova linha final, mas tenha em mente que um arquivo de texto regular deve ser terminado com uma nova linha.

    
por 05.01.2017 / 10:27