Tengo algunos archivos que están dañados con este símbolo:
^ @
No es parte de la cadena; No se puede buscar. ¿Cómo puedo sustituir este símbolo por nada o cómo elimino este símbolo?
Aquí hay una línea de ejemplo de un archivo:
^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
fuente
No creo que tus archivos estén dañados. Parece que su línea de ejemplo contiene texto normal con bytes nulos entre cada carácter. Esto sugiere que es un archivo de texto que ha sido codificado en UTF-16 pero que falta la marca de orden de bytes desde el inicio del archivo. Ver http://en.wikipedia.org/wiki/Byte-order_mark
Supongamos que abro el Bloc de notas, escribo la palabra 'nombre de archivo' y lo guardo como Unicode Big-endian. Un volcado hexadecimal de este archivo se ve así:
Si abro este archivo en Vim, se ve bien: los bytes 'fe ff' le dicen a Vim cómo se codifica el archivo. Ahora suponga que creo un archivo que contiene exactamente la misma secuencia de bytes, pero sin el principal 'fe ff'. Vim inserta ^ @ (o <00>, dependiendo de su configuración), en lugar de los bytes nulos; El bloc de notas inserta espacios.
Entonces, en lugar de eliminar los valores nulos, realmente debería buscar que Vim interprete el archivo correctamente. Puede hacer que Vim vuelva a cargar el archivo con la codificación correcta con el comando:
fuente
Esto realmente funcionó para mí dentro de vim:
fuente
<Ctrl-V><Ctrl-2>
(al igual que el que tenía<Ctrl-Shift-2>
), pero esto funcionó.Ese 'símbolo' representa un carácter NULO, con valor ASCII 000.
Es difícil de eliminar con vim, prueba
fuente
Como otros han señalado, esos son bytes nulos (ASCII 00). En Linux, la forma de ingresar valores ASCII en vim es presionar Ctrl-V seguido del valor octal de 3 dígitos de cualquier carácter. Para reemplazar todos los bytes nulos, use:
:%s/
Ctrl-V000//g
(sin espacios).
Del mismo modo, puede buscar nulos con:
/
Ctrl-V000
En ambos casos, no mostrará los ceros mientras los escribe, pero después de ingresar los tres, se mostrará
^@
. En los terminales de color lo mostrará en azul para indicar que es un personaje de control.fuente
FWIW, en mi caso tuve que usar vim en cygwin para editar un archivo de texto creado en una mac. La solución aceptada no funcionó para mí, pero estaba cerca. Según la página wiki de Vim sobre trabajar con Unicode , existe una diferencia entre las versiones Big Endian y Little Endian del byte BOM. Entonces, tuve que decirle explícitamente
vim
que usara una versión Little Endian de la codificación BOM.Solo después de elegir la codificación correcta, convertí el formato de archivo (terminaciones de línea) para
dos
poder editar el archivo en el editor de Windows. Tratar de restablecer el formato del archivo antes de especificar la codificación me dio pena. Aquí está la lista completa de comandos que utilicé:fuente
La solución aceptada no funcionó para mí. En su lugar, hice que vim canalice el archivo
tr
:Esto también funcionaría bien con el modo visual (solo escriba
:!tr -d '\000'
) o en un rango de líneas:fuente
^@
no es un mal carácter si usa una codificación adecuada, pero si desea eliminarlo, intente:tr -d '\000'
sed 's/\000//g'
Para convertir su archivo a formato Unix / Linux antes de cualquier procesamiento, intente:
dos2unix filename
- rhel y otrosdos2ux filename [newfilename]
- HP-UXfuente
Además de la respuesta de @ jrb, en Vim, la codificación de caracteres del archivo se detecta en función de la opción de codificación de archivos. (tenga en cuenta la 's' al final de las codificaciones de archivo)
Es decir, en Windows, el valor predeterminado para la
fileencodings
opción esucs-bom
, lo que significa:compruebe si existe una lista de materiales al comienzo del archivo.
Si existe BOM, entonces 'lea la codificación de caracteres del archivo fuera de BOM'.
Si BOM no existe (y en este caso eso también significaría que todas las codificaciones de caracteres especificadas en la
fileencodings
opción no coincidieron), entonces lea el archivo con la codificación de caracteres especificada en laencoding
opción. La codificación de caracteres por defecto de laencoding
opción es:latin1
. Ahora, debido a quelatin1
es la codificación de caracteres de longitud de un byte , todos los bytes en el archivo sonlatin1
caracteres válidos (incluso elNul
carácter^@
que está viendo *).* - en realidad,
^@
es el carácter de nueva línea en el texto del búfer de Vim, no el carácter Nul.La forma correcta de leer el archivo es especificar la codificación de caracteres manualmente como UTF-16 (ya que parece que UTF-16 es la codificación de caracteres adecuada en este caso).
fuente