¿Cómo decide grep que un archivo es binario?

8

Tengo un gran archivo de texto utf-8 con el que busco con frecuencia grep. Recientemente grepcomenzó 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 diffellos, 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.

Charles
fuente
Intentaría esto en este orden: 1. Ejecútelo con strace / ltrace para verificar qué entrada causa ese mensaje 'binario' 2. Revise la fuente de grep y
léalo
@muru: Estoy usando gnu grep, pero si tienes la respuesta para alguna otra versión, también me interesaría.
Charles
Impar. Tengo un archivo que sé que contiene ay nulalgunos Escs. Traté de luchar por ellos. Pude encontrar el escs ( \x1B), pero nulnunca apareció. La prueba dada anteriormente mostró 1, para la línea que contiene Escs, pero nada para ningún rango que no contenga \x1B. No confiaría en esa prueba. Intente en su grep -zc .lugar (debe ser uno más que el número de nuls en su archivo). (Además, puede que sea mejor usarlo [[:cntrl:]])
Muru
También intente: sed -z 's/.*\(....\)$/\1/' foo | od -cver algunos caracteres antes del NUL(si hay uno), lo que podría llevarlo al problema.
muru
@muru: Mi sedno tiene una -zopción: sed: invalid option -- 'z'.
Charles

Respuestas:

2

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.

otro muchacho
fuente
2

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 ...

astuto
fuente
1

Un error de codificación según mbrlen () también hace que GNU grep 2.24 lo considere binario

P.ej:

export LC_CTYPE='en_US.UTF-8'
printf 'a\x80' | grep 'a'

porque \x80no puede ser el primer byte de un punto Unicode UTF-8: https://en.wikipedia.org/wiki/UTF-8#Description

Esta es la única otra posibilidad además NUL.

grepInterpretación del código fuente de GNU que lleva a esta conclusión: ¿Qué hace que grep considere un archivo como binario?

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
fuente