ex regexp HEX char

3

Eu tenho a seguinte string

echo -e "a12\x8fb12\x9f" | xxd
0000000: 6131 328f 6231 329f 0a                   a12.b12..

e deseja excluir a sequência 12\x9f e 12\x8f com sed .

Eu posso fazer isso com este comando

sed -e 's_12\x8f__g' -e 's_12\x9f__g'

mas por que esse comando não funciona?

sed -e 's_12[\x8f\x9f]__g'
    
por بارپابابا 26.06.2014 / 14:32

1 resposta

7

Isso ocorre porque o [...] corresponde a um caractere. sed tentaria corresponder os caracteres ao intervalo especificado em [...] . Nas localidades UTF-8, você só pode encontrar \x8f como parte de um caractere de múltiplos bytes. Você perceberá que . também não corresponde (e isso é um requisito POSIX).

Por exemplo:

sed 's/[eé\xa9]//'

não faria sentido. é é um caractere (codificado como 0xc3 0xa9 ), 0xa9 não é um caractere, mas como um byte, pode ser encontrado dentro de um caractere (como é ), e é um caractere (codificado como 0x65). Você não pode esperar que sed seja capaz de combinar 0xa9 tanto dentro de um personagem quanto como um byte.

Para corresponder dados de bytes arbitrários com um utilitário texto como sed , você vai querer usar uma localidade onde os caracteres são bytes, o que é um caso típico para LC_ALL=C .

LC_ALL=C sed 's/12[\x8f\x9f]//g'

Ou portably:

LC_ALL=C sed "$(printf 's/12[77]//g')"

Observe que você não pode esperar processar dados que contenham caracteres NUL (ou que não terminem em um caractere de nova linha ou em que caracteres de nova linha sejam mais do que alguns kilobytes abertos) portável com sed . Use perl -p/-n nesse caso.

    
por 26.06.2014 / 15:19