Bytes e caracteres são idênticos apenas na localidade C (aka POSIX ) padrão, mas em todas as outras localidades eles são diferentes. Portanto, se o seu sistema usa uma localidade UTF-8 (por exemplo, en_US.UTF-8 ) por padrão, então as "classes de caractere" entre parênteses em gexk regexes são baseadas em caracteres , não em bytes individuais.
Por exemplo, /[eęė]/ é equivalente a /[e\xC4\x99\xC4\x97]/ , assumindo uma localidade * .UTF-8; no entanto, ele corresponderá à letra ę , mas não č , apesar de ambos terem C4 byte. (Por alguma razão, isso é diferente de uma simples /\xC4/ fora de uma classe de caracteres, que faz corresponder ao byte literal C4 .)
De qualquer forma, o mesmo se aplica a intervalos dentro de classes de caracteres e, como o byte FF não cria uma sequência UTF-8 válida, a biblioteca regex pode declarar inválido todo o intervalo ou algo assim.
O gawk tem a opção -b , --characters-as-bytes para desativar isso.