Tentando usar grep
hoje, encontrei o problema familiar do Byte Order Mark (BOM) em um arquivo Unicode (UTF-8, neste caso). Especificamente, eu estava tentando encontrar um arquivo começando com XYZ
o padrão grep '^XYZ'
, mas é claro que grep
tratei o BOM como três caracteres separados e não correspondia à primeira linha do arquivo se a primeira linha começasse com XYZ
. Até tentei atualizar a expressão regular para ignorar os espaços ( '^[[:space:]]*XYZ'
), mas sem sucesso.
Outras questões trataram da conversão de arquivos ou do direcionamento específico do BOM , mas quero saber se as ferramentas POSIX têm uma opção geral para lidar com arquivos Unicode corretamente. Se grep
manuseado o arquivo Unicode corretamente, ele consideraria que o conteúdo do arquivo começa após o BOM e corresponde XYZ
na primeira linha como qualquer outra linha.
O Unicode Consortium tem um FAQ que inclui Como devo lidar com BOMs . Esta porção inclui:
e
Observe que UTF-8 é sempre de endianidade conhecida, porque não possui endianidade. Portanto, desde que você saiba que o texto é UTF-8, "o BOM não deve ser usado".
Even
cat
retornará resultados incorretos ao usar um BOM desnecessariamente, pois os BOMs de todos os arquivos, exceto o primeiro, serão tratados como espaços sem quebra de largura zero. Mas o poder do UNIX está nos filtros.Para operações em um único arquivo ou fluxo,
sed "1s/^$(printf '\357\273\277')//"
em um pipeline removerá um BOM, se presente, deixando todos os outros fluxos intactos.Para operações com vários arquivos, um shell com substituição de processo (como o Bash, mas infelizmente não o shell POSIX) é útil:
A maioria das ferramentas POSIX opera em bytes e não em caracteres. A sinalização Unicode não tem sentido para eles, então será tratada como qualquer outro dado.
Pela outra resposta , parece que eu estava lidando com arquivos com uma assinatura BOM inadequada.
Portanto, a resposta é que as ferramentas POSIX já lidam com arquivos Unicode (UTF-8) corretamente.
Se você tem um Unicode ruim, é claro que eles não lidam com isso corretamente, mas você pode usar o direcionamento de BOM de outras questões para lidar com assinaturas de BOM supérfluas.