Como remover este símbolo “^ @” com o vim?

56

Eu tenho alguns arquivos corrompidos com este símbolo:

^@

Não faz parte da string; não é pesquisável. Como faço para substituir este símbolo por nada ou como excluo este símbolo?

Aqui está uma linha de exemplo de um arquivo:

^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
    
por mrt181 25.11.2009 / 11:16

9 respostas

48

Você pode tentar:

  • %s/<CTRL-2>//g (em PCs normais)

  • %s/<CTRL-SHIFT-2>//g (em computadores Mac)

onde <CTRL-2> significa primeiro pressionar a CTRL em PCs normais, mantendo-a pressionada, tecle 2 , libere CTRL .

e <CTRL-SHIFT-2> significam primeiro pressionar o controle em computadores Mac, mantendo-o pressionado, pressione shift em computadores Mac, mantendo-o pressionado, aperte 2 , libere control e shift .

Finalmente, os dois comandos devem resultar em %s/^@//g na tela. ^@ significa um único caractere (um byte NULL, que não poderia ser exibido), não ^ seguido por @ , portanto, não é possível digitar ^ e @ em uma linha no acima do comando.

Este comando remove todo o ^@ .

    
por 25.11.2009 / 13:36
49

Eu não acho que seus arquivos estão corrompidos. Sua linha de exemplo parece conter texto regular com bytes nulos entre cada caractere. Isso sugere que é um arquivo de texto codificado em UTF-16, mas a marca de ordem de bytes está ausente no início do arquivo. Consulte o link

Suponha que eu abra o Bloco de Notas, digite a palavra 'filename' e salve como Unicode Big-endian. Um dump hexadecimal deste arquivo se parece com isto:

fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65

Se eu abrir este arquivo no Vim, ele ficará bem - os bytes 'fe f' dizem ao Vim como o arquivo está codificado. Agora, suponha que eu crie um arquivo contendo exatamente a mesma seqüência de bytes, mas sem o "fe ff" inicial. O Vim insere ^ @ (ou < 00 & gt ;, dependendo da sua configuração), no lugar dos bytes nulos; O bloco de notas insere espaços.

Então, ao invés de remover os nulos, você deve estar realmente procurando obter o Vim para interpretar o arquivo corretamente. Você pode obter o Vim para recarregar o arquivo com a codificação correta com o comando:

:e ++enc=utf16

    
por 25.11.2009 / 12:58
34

Isso realmente funcionou para mim dentro do vim:

:%s/\%x00//g
    
por 16.07.2012 / 03:20
12

Esse 'símbolo' representa um caractere NULL, com valor ASCII 000.

É difícil remover com o vim, tente

tr -d '
tr -d '%pre%0' < file1 > file2
0' < file1 > file2
    
por 25.11.2009 / 11:22
6

FWIW, no meu caso eu 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 perto. De acordo com página wiki Vim sobre como trabalhar com Unicode , há uma diferença entre as versões Big Endian e Little Endian do byte BOM. Então, eu tive que dizer explicitamente a vim para usar uma versão Little Endian da codificação de BOM.

Somente depois de escolher a codificação correta, converti o formato de arquivo (finais de linha) em dos , para poder editar o arquivo no editor do Windows. Tentando definir redefinir o formato de arquivo antes de especificar a codificação me deu pesar. Aqui está a lista completa de comandos que usei:

:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq
    
por 24.10.2013 / 21:12
6

Como outros notaram, 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 + V 000//g

(sem espaços).

Da mesma forma, você pode pesquisar nulos com:

/ Ctrl + V 000

Em ambos os casos, ele não mostrará os zeros enquanto você os digita, mas depois de inserir todos os três, ele exibirá ^@ . Nos terminais de cor, ele mostrará em azul para indicar que é um caractere de controle.

    
por 12.09.2014 / 20:51
3

A solução aceita não funcionou para mim. Eu fiz o vim canalizar o arquivo através de tr :

:%!tr -d '
# Remove nulls from current line:
:.!tr -d '
:%!tr -d '
# Remove nulls from current line:
:.!tr -d '%pre%0'

# Remove nulls from lines 3-5:
:3,5!tr -d '%pre%0'
0'
0' # Remove nulls from lines 3-5: :3,5!tr -d '%pre%0'
0'

Isso também funcionaria bem com o modo visual (apenas digite :!tr -d '%code%0' ) ou em um intervalo de linhas:

%pre%     
por 12.07.2012 / 16:19
2

^@ não é um caractere ruim se você usar uma codificação adequada, mas se quiser removê-lo, tente:

  • tr -d 'sed 's/dos2unix filename0//g'0'
  • dos2ux filename [newfilename]

^M character is there in your example data

Para converter seu arquivo para o formato Unix / Linux antes de qualquer processamento, tente:

%code% - rhel e outros

%code% - HP-UX

    
por 31.08.2015 / 00:32
1

Além da resposta do @jrb, no Vim, a codificação de caracteres do arquivo é detectada com base na opção de fileencodings. (note que o 's' no final dos fileencodings)

Ou seja. no Windows, o valor padrão da opção fileencodings é ucs-bom , o que significa:

verifique se o BOM existe no início do arquivo.

Se a lista de materiais existe, então 'leia a codificação de caracteres do arquivo fora da lista de materiais'.

Se a lista de materiais não existir (e, nesse caso, isso também significaria que todas as codificações de caracteres especificadas na opção fileencodings não corresponderam), leia o arquivo com a codificação de caracteres especificada na opção encoding . A codificação de caractere padrão para a opção encoding é: latin1 . Agora, como latin1 é a codificação de caracteres de um byte , todos bytes no arquivo são válidos latin1 caracteres (até mesmo o Nul character ^@ 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 (como se parece com UTF-16 é a codificação de caracteres apropriada neste caso).

    
por 10.06.2013 / 14:13