Substitua apenas oito dígitos hexadecimais, ignore se tiverem menos que ou mais que 8 dígitos juntos. Usando o comando sed

2

Exemplo:

Entrada:

0x12345678 0aef1234 0098adefa 123456789 

Resultado esperado:

0x00000000 00000000 0098adefa 123456789

Tentei isto:

sed -E "s/[0-9a-fA-F]{8}/00000000/g" 

Mas isso substitui mesmo que haja mais de 8 dígitos hexadecimais.

    
por Hidayathullah Khan 22.06.2018 / 13:00

3 respostas

5

Você pode usar o limite de palavras \b para marcar o início ou o fim de uma palavra e, além disso, é necessário levar em conta que o 0x é possível na frente do número:

sed -E 's/\b(0x|)[0-9a-fA-F]{8}\b/0000000/g'

Ainda assim, há casos especiais em que você precisa pensar sobre o que fazer com eles, como 00x12345678 , no padrão acima ele não é substituído.

    
por 22.06.2018 / 13:23
4

Em Perl, você pode usar as "asserções de look-around", ou seja, você pode dizer "não precedido por um hexdigit" e "não seguido por um hexdigit":

perl -pe 's/(?<![0-9a-fA-F])[0-9a-fA-F]{8}(?![0-9a-fA-F])/00000000/g'

As aparências não contam na string correspondente, ou seja, elas não são substituídas e podem corresponder mais de uma vez (uma vez no look-behind e uma vez no look-ahead).

Você também pode usar a classe [:xdigit:] POSIX em vez de 0-9a-fA-F .

    
por 22.06.2018 / 13:21
1
$ echo '0x12345678 0aef1234 0098adefa 123456789' | sed -E 's/(\<|x)[[:xdigit:]]{8}\>/0000000/g'
0x00000000 00000000 0098adefa 123456789

$ echo '12345678 0aef1234 0098adefa 123456789' | sed -E 's/(\<|x)[[:xdigit:]]{8}\>/0000000/g'
00000000 00000000 0098adefa 123456789

A expressão regular

(\<|x)[[:xdigit:]]{8}\>

corresponderá a um número hexadecimal com oito dígitos. Deve ser uma palavra completa ou ser precedida por um x . O caractere precedente (o x , se houver) é salvo e inserido antes dos zeros na substituição.

    
por 22.06.2018 / 13:45