Como posso remover o BOM de um arquivo UTF-8?

28

Eu tenho um arquivo na codificação UTF-8 com BOM e quero remover a BOM. Existe alguma ferramenta de linha de comando do Linux para remover a lista de materiais do arquivo?

$ file test.xml
test.xml:  XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
    
por m13r 23.07.2017 / 12:05

6 respostas

39

Se você não tiver certeza se o arquivo contém uma lista de materiais UTF-8, isso (assumindo a implementação GNU de sed ) removerá a BOM se ela existir ou não fará alterações se ela não ocorrer. / p>

sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt

Você também pode sobrescrever o arquivo existente com a opção -i :

sed -i '1s/^\xEF\xBB\xBF//' orig.txt
    
por 23.07.2017 / 16:08
45

Uma lista de materiais não faz sentido em UTF-8. Esses são geralmente adicionados por engano por software falso em sistemas operacionais da Microsoft.

dos2unix irá removê-lo e também cuidará de outras idiossincrasias dos arquivos de texto do Windows.

dos2unix test.xml
    
por 23.07.2017 / 12:42
16

É possível remover a lista de materiais de um arquivo com o comando tail :

tail -c +4 withBOM.txt > withoutBOM.txt
    
por 23.07.2017 / 12:05
9

Usando o VIM

  1. Abrir arquivo no VIM:

    vi text.xml
    
  2. Remover a codificação de BOM:

    :set nobomb
    
  3. Salvar e sair:

    :wq
    
por 24.12.2017 / 19:05
4

Você pode usar

LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename

para remover a marca de ordem de byte do início do arquivo, se houver, bem como converter qualquer nova linha CR LF para LF apenas. O LANG=C LC_ALL=C informa ao shell que você deseja que o comando seja executado na localidade C padrão (também conhecida como o código de idioma POSIX padrão), em que os três bytes que formam a Marca de Ordem de Byte são tratados como bytes. A opção -i para sed significa in loco. Se você usar -i.old , o sed salvará o arquivo original como filename.old e o novo arquivo (com as modificações, se houver) como filename .

Eu pessoalmente gosto de ter isso como ~/bin/fix-ms ; por exemplo, como

#!/bin/dash
export LANG=C LC_ALL=C
if [ $# -gt 0 ]; then
    for FILE in "$@" ; do
        sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$FILE" || exit 1
    done
else
    exec sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//'
fi

para que, se eu precisar aplicar isso para dizer todos os arquivos-fonte e cabeçalhos C (meu código antigo da era do MS-DOS, por exemplo!), eu simplesmente corro

find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix

ou, se eu quiser apenas olhar para esse arquivo, sem modificá-lo, posso executar

~/bin/ms-fix < filename | less

e não ver o feio <U+FEFF> no meu terminal UTF-8.

    
por 23.07.2017 / 21:10
0

Recentemente, encontrei esta minúscula ferramenta de linha de comando que adiciona ou remove a BOM em arquivos codificados com UTF-8 arbitrário: UTF BOM Utils ( novo link no github)

Pequena desvantagem, você pode baixar apenas o código-fonte C ++ simples. Você tem que criar o makefile (com o CMake , por exemplo) e compilá-lo sozinho, os binários não são fornecidos nesta página.

    
por 16.10.2018 / 19:58