Eu tenho alguns arquivos que estão corrompidos com este símbolo:
^ @
Não faz parte da cadeia; não é pesquisável. Como substituo este símbolo por nada ou como excluo este símbolo?
Aqui está um exemplo de linha de um arquivo:
^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
fonte
Eu não acho que seus arquivos estão corrompidos. Sua linha de exemplo parece conter texto normal com bytes nulos entre cada caractere. Isso sugere que é um arquivo de texto codificado em UTF-16, mas a marca de ordem dos bytes está ausente desde o início do arquivo. Veja http://en.wikipedia.org/wiki/Byte-order_mark
Suponha que eu abra o Bloco de notas, digite a palavra 'nome do arquivo' e salve como Bigode end-Unicode. Um despejo hexadecimal desse arquivo se parece com o seguinte:
Se eu abrir esse arquivo no Vim, ele ficará bem - os bytes 'fe ff' informam ao Vim como o arquivo é codificado. Agora, suponha que eu crie um arquivo contendo exatamente a mesma sequência de bytes, mas sem o primeiro 'fe ff'. O Vim insere ^ @ (ou <00>, dependendo da sua configuração), no lugar dos bytes nulos; O bloco de notas insere espaços.
Portanto, em vez de remover os nulos, você deve realmente procurar que o Vim interprete o arquivo corretamente. Você pode fazer com que o Vim recarregue o arquivo com a codificação correta com o comando:
fonte
Isso realmente funcionou para mim no vim:
fonte
<Ctrl-V><Ctrl-2>
(além da pessoa com<Ctrl-Shift-2>
), mas isso funcionou.Esse 'símbolo' representa um caractere NULL, com valor ASCII 000.
É difícil remover com o vim, tente
fonte
Como outros observaram, esses são bytes nulos (ASCII 00). No Linux, a maneira de inserir valores ASCII no vim é pressionar Ctrl-V seguido pelo valor octal de 3 dígitos de qualquer caractere. Para substituir todos os bytes nulos, use:
:%s/
Ctrl-V000//g
(sem espaços).
Da mesma forma, você pode procurar nulos com:
/
Ctrl-V000
Nos dois casos, ele não mostrará os zeros enquanto você os digita, mas depois de inserir os três, será exibido
^@
. Nos terminais coloridos, mostrará isso em azul para indicar que é um caractere de controle.fonte
FWIW, no meu caso, tive que usar o vim no cygwin para editar um arquivo de texto criado em um mac. A solução aceita não funcionou para mim, mas estava próxima. De acordo com a página wiki do Vim sobre como trabalhar com Unicode , há uma diferença entre as versões Big Endian e Little Endian do byte da BOM. Então, eu tive que dizer explicitamente
vim
para usar uma versão Little Endian da codificação de BOM.Somente depois de escolher a codificação correta, converti o formato do arquivo (finais de linha) para
dos
que eu pudesse editar o arquivo no editor do Windows. Tentar definir redefinir o formato do arquivo antes de especificar a codificação me deixou triste. Aqui está a lista completa de comandos que eu usei:fonte
A solução aceita não funcionou para mim. Eu fiz o vim canalizar o arquivo em
tr
vez disso:Isso também funcionaria bem com o modo visual (apenas digitar
:!tr -d '\000'
) ou em várias linhas:fonte
^@
não é um caractere ruim se você usar uma codificação adequada, mas se desejar remover, tente:tr -d '\000'
sed 's/\000//g'
Para converter seu arquivo para o formato Unix / Linux antes de qualquer processamento, tente:
dos2unix filename
- rhel e outrosdos2ux filename [newfilename]
- HP-UXfonte
Além da resposta do @ jrb, no Vim, a codificação de caracteres do arquivo é detectada com base na opção codificação de arquivos. (observe os 's' no final das codificações de arquivo)
Ou seja, no Windows, o valor padrão para a
fileencodings
opção éucs-bom
, o que significa:verifique se a lista técnica existe no início do arquivo.
Se a lista técnica existir, 'leia a codificação de caracteres do arquivo fora da lista técnica'.
Se a BOM não existir (e, nesse caso, isso também significaria que todas as codificações de caracteres especificadas na
fileencodings
opção falharam em corresponder), leia o arquivo com a codificação de caracteres especificada naencoding
opção. A codificação de caracteres padrão para aencoding
opção é:latin1
. Agora, comolatin1
é a codificação de caracteres de um byte , todos os bytes no arquivo sãolatin1
caracteres válidos (mesmo oNul
caractere^@
que você está vendo *).* - na verdade,
^@
é o caractere de nova linha no texto do buffer do Vim, não o caractere Nul.A maneira correta de ler o arquivo é especificar a codificação de caracteres manualmente como UTF-16 (pois parece que UTF-16 é a codificação char apropriada nesse caso).
fonte