AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 413712
Accepted
Dimitrios Desyllas
Dimitrios Desyllas
Asked: 2017-12-30 12:38:13 +0800 CST2017-12-30 12:38:13 +0800 CST 2017-12-30 12:38:13 +0800 CST

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

  • 772

Eu tenho o arquivo ~/dummy_hex.txtcontendo hex e string 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 devolva o valor 4

Até agora eu 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 um resultado errado devido ao tipo incorreto de regex. Você pode me dizer como usar regex compartible PCRE completo com sed para fazer isso?

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

Editar 1

Uma outra abordagem é contar as \xocorrências de string, mas isso pode contar qualquer desvio \xque não possa ser seguido por um valor que indique uma string hexadimal.

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

Além disso, tentei fazer isso com a -ropção que habilita o 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 expressão #1, char 31: comando `s' não finalizado

text-processing sed
  • 4 4 respostas
  • 1275 Views

4 respostas

  • Voted
  1. Best Answer
    Jeff Schaller
    2017-12-30T13:11:05+08:002017-12-30T13:11:05+08:00

    Com um grepque suporta Expressões Regulares Estendidas e a -oopção:

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

    Para atender a exigência de command filename:

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

    Como:

    counthex input
    
    • 2
  2. user232326
    2017-12-30T13:01:08+08:002017-12-30T13:01:08+08:00

    Se você contar os caracteres sem hex:

    $ sed 's/\([^\]*\)\\x[0-9A-Fa-f][0-9A-Fa-f]/\1/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 roteiro:

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

    Estampas:

    $ ./script
    4
    

    Lembre-se de que wc conta bytes (não caracteres dependentes de localidade).

    • 1
  3. thrig
    2017-12-30T13:03:14+08:002017-12-30T13:03:14+08:00
    $ cat input
    bla\x12\xA1\xF1
    \xE3bla
    $ perl -nle '$c++ while m/\\x[[:xdigit:]]/g; END { print $c }' input
    4
    $ 
    

    Basicamente, faça um loop sem imprimir sobre a entrada ( perldoc perlrun), incremente um contador para cada correspondência e, em seguida, imprima essa contagem.

    • 1
  4. Dimitrios Desyllas
    2017-12-30T13:04:13+08:002017-12-30T13:04:13+08:00

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

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

    Isso oferece um oneliner rápido e fácil caso você não queira escrever um script (por exemplo, em uma folha de instruções que conterá comandos a serem executados).

    • 0

relate perguntas

  • Como remover uma única linha entre duas linhas

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve