O Unicode Consortium tem uma FAQ que inclui Como devo lidar com listas de materiais . Esta parte inclui:
Where a text data stream is known to be plain Unicode text (but not which endian), then BOM can be used as a signature. If there is no BOM, the text should be interpreted as big-endian.
e
Where the precise type of the data stream is known (e.g. Unicode big-endian or Unicode little-endian), the BOM should not be used. In particular, whenever a data stream is declared to be UTF-16BE, UTF-16LE, UTF-32BE or UTF-32LE a BOM must not be used.
Note que o UTF-8 é sempre de endianness conhecido, porque não tem endianness. Portanto, contanto que você saiba que o texto é UTF-8, "a BOM não deve ser usada".
Mesmo cat
retornará resultados incorretos ao usar um BOM desnecessariamente, já que os BOMs de todos os arquivos, mas 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 '737')//"
em um pipeline removerá uma 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:
sb() { sed "1s/$(printf '737')//" "$@" ; }
cat <(sb file1) <(sb file2) …