Respostas:
Experimente isto:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
No primeiro registro (linha), remova os caracteres BOM. Imprima todos os registros.
Ou um pouco mais curto, usando o conhecimento de que a ação padrão no awk é imprimir o registro:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
é a condição mais curta que sempre avalia como verdadeira, portanto, cada registro é impresso.
Aproveitar!
-- TERMO ADITIVO --
As perguntas frequentes sobre Unicode Byte Order Mark (BOM) incluem a seguinte tabela que lista os bytes de BOM exatos para cada codificação:
Bytes | Encoding Form
--------------------------------------
00 00 FE FF | UTF-32, big-endian
FF FE 00 00 | UTF-32, little-endian
FE FF | UTF-16, big-endian
FF FE | UTF-16, little-endian
EF BB BF | UTF-8
Assim, você pode ver como \xef\xbb\xbf
corresponde aos EF BB BF
UTF-8
bytes de BOM da tabela acima.
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILE
e certifique-se de que INFILE e OUTFILE são diferentes!
perl -i.orig -pe 's/^\x{FFFE}//' badfile
pode contar com suas variáveis de ambiente PERL_UNICODE e / ou PERLIO para a codificação. PERL_UNICODE = SD funcionaria para UTF-8; para os outros, você precisaria do PERLIO.
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'
Usando GNU sed
(no Linux ou Cygwin):
# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt
No FreeBSD:
sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt
Vantagem de usar GNU ou FreeBSD sed
: o -i
parâmetro significa "no lugar" e atualizará os arquivos sem a necessidade de redirecionamentos ou truques estranhos.
No Mac:
Esta awk
solução em outra resposta funciona , mas o sed
comando acima não funciona. Pelo menos no Mac (Sierra)sed
não menciona o suporte de ala de escape hexadecimal \xef
.
Um truque semelhante pode ser alcançado com qualquer programa direcionando para a sponge
ferramenta de moreutils :
awk '…' INFILE | sponge INFILE
10.11.6
, isso não funciona, mas a resposta oficial stackoverflow.com/a/1068700/9636 funciona bem.
Não awk, mas mais simples:
tail -c +4 UTF8 > UTF8.nobom
Para verificar o BOM:
hd -n 3 UTF8
Se o BOM estiver presente, você verá: 00000000 ef bb bf ...
cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8
vai ser quebrado. Nunca use um BOM em UTF-8. Período.
hd
não está disponível no Mac OS X (a partir de 10.8.2), de modo a verificar a existência de um UTF-8 BOM lá você pode usar o seguinte: head -c 3 file | od -t x1
.
Além de converter terminações de linha CRLF em LF, dos2unix
também remove BOMs:
dos2unix *.txt
dos2unix
também converte arquivos UTF-16 com BOM (mas não arquivos UTF-16 sem BOM) em UTF-8 sem BOM:
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16be>bom-utf16be
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16le>bom-utf16le
$ printf '\ufeffä\n'>bom-utf8
$ printf 'ä\n'|iconv -f utf-8 -t utf-16be>utf16be
$ printf 'ä\n'|iconv -f utf-8 -t utf-16le>utf16le
$ printf 'ä\n'>utf8
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be feff00e4000a
bom-utf16le fffee4000a00
bom-utf8 efbbbfc3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
$ dos2unix -q *
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be c3a40a
bom-utf16le c3a40a
bom-utf8 c3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
Sei que a pergunta foi direcionada ao unix / linux, achei que valeria a pena citar uma boa opção para quem tem desafios para unix (em windows, com UI).
Eu encontrei o mesmo problema em um projeto WordPress (o BOM estava causando problemas com feed de rss e validação de página) e tive que examinar todos os arquivos em uma árvore de diretório bem grande para encontrar aquele que estava com o BOM. Encontrou um aplicativo chamado Replace Pioneer e nele:
Batch Runner -> Pesquisar (para encontrar todos os arquivos nas subpastas) -> Substituir modelo -> BOM remover BOM (há um modelo pronto de pesquisa e substituição para isso).
Não era a solução mais elegante e exigia a instalação de um programa, o que é uma desvantagem. Mas depois que descobri o que estava acontecendo ao meu redor, funcionou perfeitamente (e encontrei 3 arquivos entre cerca de 2300 que estavam com o BOM).