Tengo un gran archivo de texto utf-8 con el que busco con frecuencia grep
. Recientemente grep
comenzó a informar que se trataba de un archivo binario. Puedo continuar buscándolo grep -a
, pero me preguntaba qué cambio hizo que decidiera que el archivo ahora era binario.
Tengo una copia del mes pasado donde el archivo ya no se detecta como binario, pero no es práctico para diff
ellos, ya que difieren en> 20,000 líneas.
file
identifica mi archivo como
Texto en inglés UTF-8 Unicode, con líneas muy largas
¿Cómo puedo encontrar los caracteres / líneas / etc. en mi archivo que están desencadenando este cambio?
La pregunta similar, no duplicada, 19907 cubre la posibilidad de NUL, pero grep -Pc '[\x00-\x1F]'
dice que no tengo NUL ni ningún otro grupo de control ANSI.
fuente
nul
algunosEsc
s. Traté de luchar por ellos. Pude encontrar elesc
s (\x1B
), peronul
nunca apareció. La prueba dada anteriormente mostró 1, para la línea que contieneEsc
s, pero nada para ningún rango que no contenga\x1B
. No confiaría en esa prueba. Intente en sugrep -zc .
lugar (debe ser uno más que el número denul
s en su archivo). (Además, puede que sea mejor usarlo[[:cntrl:]]
)sed -z 's/.*\(....\)$/\1/' foo | od -c
ver algunos caracteres antes delNUL
(si hay uno), lo que podría llevarlo al problema.sed
no tiene una-z
opción:sed: invalid option -- 'z'
.Respuestas:
Parece ser la presencia del carácter nulo en el archivo. (Normalmente se muestra ^ @) Ingresé varios caracteres de control en un archivo de texto (como eliminar, ^ ?, por ejemplo), y solo el carácter nulo hizo que grep lo considerara un binario Esto solo se probó para grep. Los comandos less y diff, por ejemplo, pueden tener diferentes métodos. Los caracteres de control en general no aparecen excepto en binarios. Las excepciones son los caracteres de espacio en blanco: nueva línea (^ M), tabulación (^ I), avance de página (^ L), tabulación vertical (^ K) y retorno (^ J).
Sin embargo, los caracteres extranjeros, como las letras árabes o chinas, no son ascii estándar, y quizás podrían confundirse con los caracteres de control. Quizás es por eso que es solo el personaje nulo.
Puede probarlo usted mismo insertando caracteres de control en un archivo de texto utilizando el editor de texto vim. Simplemente vaya al modo de inserción, presione control-v y luego el carácter de control.
fuente
Una implementación grep moderna típica solo debería declarar un archivo "binario" si hay bytes nulos dentro. Cualquier otra cosa debería estar bien.
No puedo hablar por la implementación grep que usas ...
fuente
Un error de codificación según mbrlen () también hace que GNU grep 2.24 lo considere binario
P.ej:
porque
\x80
no puede ser el primer byte de un punto Unicode UTF-8: https://en.wikipedia.org/wiki/UTF-8#DescriptionEsta es la única otra posibilidad además
NUL
.grep
Interpretación del código fuente de GNU que lleva a esta conclusión: ¿Qué hace que grep considere un archivo como binario?fuente