Localizando quantos valores hexadecimais uma string contendo string hexadecimal e aleatória

0

Eu tenho o arquivo ~/dummy_hex.txt contendo string hexadecimal e aleatória:

\x12\xA1\xF1\xE3somegibberigh

Eu quero contar quantos valores hexadecimais (grupos de \ x ^ hex_digit ^^ hex_digit ^) a string acima possui. No exemplo acima, quero que os comandos sejam executados para retornar o número 4 .

Em outras palavras, quero digitar no meu terminal:

command ^file_having hex^

E retorne o valor 4

Até agora, tentei fazer isso com:

sed 's/[^\x[0-9A-Fa-f][0-9A-Fa-f]]//g' dummy_hex.txt | awk '{ print length }'

Mas de alguma forma parece retornar resultado errado por causa do misstype regex. Você pode me dizer como usar a regex compartimental completa do PCRE com sed para fazer isso?

Como alternativa, quero contar quantos valores hexadecimais minha string contém.

Editar 1

Uma outra abordagem é contar as ocorrências% string\x, mas isso pode contar qualquer stray \x que não pode ser seguido por um valor indicando uma string hexadimal.

 sed 's/[^\x]//g' dummy_hex.txt | awk '{ print length }'

Ainda mais eu tentei fazer isso com -r opção que permite PCRE:

 sed -r 's/^\x[0-9A-Fa-f][0-9A-Fa-f]]/g' dummy_hex.txt | awk '{ print length }'

Mas recebo o erro:

sed: -e expression #1, char 31: unterminated 's' command

    
por Dimitrios Desyllas 29.12.2017 / 21:38

4 respostas

2

Com um grep que suporta Expressões regulares estendidas e a opção -o :

grep -Eo '\x[[:xdigit:]]{2}' input | wc -l

Para atender ao requisito de command filename :

function counthex() {
  grep -Eo '\x[[:xdigit:]]{2}' "$1" | wc -l
}

Como:

counthex input
    
por 29.12.2017 / 22:11
1
$ cat input
bla\x12\xA1\xF1
\xE3bla
$ perl -nle '$c++ while m/\x[[:xdigit:]]/g; END { print $c }' input
4
$ 

Basicamente, loop sem imprimir a entrada ( perldoc perlrun ), incrementar um contador para cada correspondência e depois imprimir essa contagem.

    
por 29.12.2017 / 22:03
1

Se você contar os caracteres sem hex:

$ sed 's/\([^\]*\)\x[0-9A-Fa-f][0-9A-Fa-f]//g' dummy_hex.txt | LC_ALL=C wc -c
14

E subtraia isso de toda a contagem de arquivos:

$ <dummy_hex.txt wc -c
30

Você pode obter a contagem de caracteres hexadecimais (vezes 4). Em um script:

#!/bin/bash
a=$(sed 's/\([^\]*\)\x[0-9A-Fa-f][0-9A-Fa-f]//g' dummy_hex.txt | wc -c)
b=$(<dummy_hex.txt wc -c )
count=$(( (b-a)/4 ))
echo "$count"

Impressões:

$ ./script
4

Lembre-se de que wc conta bytes (não caracteres dependentes de código de idioma).

    
por 29.12.2017 / 22:01
0

Uma solução alternativa é usar o perl instalado para fazer isso:

perl -lne 'print my $c = () = /\x[[:xdigit:]]+/' dummy_hex.txt

Isso oferece um delineador rápido e fácil caso você não queira escrever um script (por exemplo, em uma folha de instruções que contenha comandos para executar).

    
por 29.12.2017 / 22:04