Eu tenho um arquivo na codificação UTF-8 com a BOM e quero remover a BOM. Existem ferramentas de linha de comando do linux para remover a lista técnica do arquivo?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
command-line
files
unicode
m13r
fonte
fonte
Respostas:
Se você não tiver certeza se o arquivo contém uma BOM UTF-8, isso (assumindo a implementação GNU de
sed
) removerá a BOM, se existir, ou não fará alterações, se não existir.Você também pode substituir o arquivo existente com a
-i
opção:fonte
en_US.UTF-8
localidade e funcionou. Quando isso vai falhar?1s/
significa apenas pesquisar na primeira linha; outras linhas não são afetadas. Os^
meios correspondem apenas no início da (primeira) linha.\xEF\xBB\xBF
é a lista técnica UTF-8 (cadeia hexadecimal com escape).//
significa substituir por nada. Eu poderia ter adicionado1
ao final (para1s/^xEF\xBB\xBF//1
), o que significaria apenas corresponder à primeira ocorrência do padrão na linha. Mas, como a pesquisa está ancorada^
, isso não fará nenhuma diferença. Se o arquivo não tiver a lista técnica no início da primeira linha, o padrão não corresponderá e, portanto, nenhuma alteração será feita.Uma lista técnica não faz sentido no UTF-8. Esses são geralmente adicionados por engano por softwares falsos nos sistemas operacionais da Microsoft.
dos2unix
irá removê-lo e também cuidar de outras idiossincrasias dos arquivos de texto do Windows.fonte
dos2unix
?É possível remover a lista técnica de um arquivo com o
tail
comando:fonte
tail
está usando 1 indexação baseada ?! WTF!tail -c -1
outail -c 1
(para o quetail
geralmente é usado) é o conteúdo que começa com o último byte,tail -c +1
começando com o primeiro byte.tail -c 0
/tail -c +0
para isso seria muito mais intuitivo.(dd bs=1 count=3 of=/dev/null; cat) <input >output
. Ou com o GNU(head -c3 >/dev/null; cat)
- mesmo em UTF8 ou outro local não de byte único; O cabeçalho GNU faz 'char' = byte.Usando o VIM
Abrir arquivo no VIM:
Remova a codificação da BOM:
Salve e saia:
fonte
<feff>
, mas:set nobomb
não o modifica ou remove.Você pode usar
para remover a marca de ordem de bytes do início do arquivo, se houver, e converter qualquer nova linha de CR LF em LF apenas. O
LANG=C LC_ALL=C
comando diz ao shell que você deseja que o comando seja executado no código de idioma C padrão (também conhecido como código de idioma POSIX padrão), onde os três bytes que formam a Marca de Ordem de Byte são tratados como bytes. A-i
opção para sed significa no local. Se você usar-i.old
, o sed salva o arquivo original comofilename.old
e o novo arquivo (com as modificações, se houver) comofilename
.Eu pessoalmente gosto de ter isso como
~/bin/fix-ms
; por exemplo, comopara que, se eu precisar aplicar isso para dizer todos os arquivos e cabeçalhos de origem C (meu código antigo da era do MS-DOS, por exemplo!), eu apenas corro
ou, se eu quiser apenas ver um arquivo desse tipo, sem modificá-lo, posso executar
e não ver o feio
<U+FEFF>
no meu terminal UTF-8.fonte
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
?sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
não ocorre; ele retorna um código de saída, mas processa todos os arquivos listados na lista de argumentos antes de sair.--
antes do (s) nome (s) do arquivo é, obviamente, importante: sem ele, os nomes de arquivo que começam com um hífen podem ser considerados opções pelo sed. Eu os editei na minha resposta; obrigado pela lembrança!Recentemente, encontrei esta pequena ferramenta de linha de comando que adiciona ou remove a lista técnica em arquivos codificados UTF-8 arbitrários: UTF BOM Utils ( novo link no github)
Pouco inconveniente, você pode baixar apenas o código-fonte C ++ simples. Você precisa criar o makefile (com o CMake , por exemplo) e compilá-lo sozinho, os binários não são fornecidos nesta página.
fonte