Wie entscheidet grep, dass eine Datei binär ist?

8

Ich habe eine große utf-8-Textdatei, mit der ich häufig suche grep. Vor kurzem wurde grepberichtet, dass es sich um eine Binärdatei handelt. Ich kann weiter damit suchen grep -a, aber ich habe mich gefragt, welche Änderung dazu geführt hat, dass die Datei jetzt binär ist.

Ich habe eine Kopie vom letzten Monat, in der die Datei nicht mehr als binär erkannt wird, aber es ist für sie nicht praktikabel, diffda sie sich in> 20.000 Zeilen unterscheiden.

file identifiziert meine Datei als

UTF-8 Unicode Englischer Text mit sehr langen Zeilen

Wie finde ich die Zeichen / Zeilen / etc. in meiner Datei, die diese Änderung auslösen?


Die ähnliche, nicht doppelte Frage 19907 deckt die Möglichkeit von NUL ab, grep -Pc '[\x00-\x1F]'sagt aber , dass ich keine NUL oder andere ANSI-Kontroll-Chaarcter habe.

Charles
quelle
Ich würde dies in dieser Reihenfolge versuchen: 1. Führen Sie es mit strace / ltrace aus, um zu überprüfen, welche Eingabe diese 'binäre' Nachricht verursacht. 2. Überprüfen Sie die Quelle von grep und lesen Sie sie
ott--
@muru: Ich benutze gnu grep, aber wenn du die Antwort für eine andere Version hast, würde mich das auch interessieren.
Charles
Seltsam. Ich habe eine Datei, von der ich weiß, dass sie a nulund einige Escs enthält. Ich habe versucht, nach ihnen zu greifen. Ich konnte das escs ( \x1B) finden, aber das ist nulnie aufgetaucht. Der oben angegebene Test ergab 1 für die Linie, die Escs enthält, aber nichts für einen Bereich, der nicht enthält \x1B. Ich würde diesem Test nicht vertrauen. Versuchen Sie es grep -zc .stattdessen (sollte eins mehr sein als die Anzahl der nuls in Ihrer Datei). (Auch könnten Sie besser dran sein [[:cntrl:]].)
Muru
Versuchen Sie auch: sed -z 's/.*\(....\)$/\1/' foo | od -ceinige Zeichen vor dem NUL(falls vorhanden) zu sehen, was Sie möglicherweise zu dem Problem führen könnte.
Muru
@muru: Mein sedhat keine -zOption : sed: invalid option -- 'z'.
Charles

Antworten:

2

Es scheint das Vorhandensein des Nullzeichens in der Datei zu sein. (Wird normalerweise ^ @ angezeigt.) Ich habe verschiedene Steuerzeichen in eine Textdatei eingegeben (wie z. B. Löschen, ^?), Und nur das Nullzeichen hat grep veranlasst, dies zu berücksichtigen eine binäre. Dies wurde nur auf grep getestet. Die Befehle less und diff können beispielsweise unterschiedliche Methoden haben. Steuerzeichen werden im Allgemeinen nur in Binärdateien angezeigt. Ausnahmen sind die Leerzeichen: Zeilenumbruch (^ M), Tabulator (^ I), Formfeed (^ L), vertikaler Tabulator (^ K) und Rückgabe (^ J).

Fremdzeichen wie arabische oder chinesische Buchstaben sind jedoch keine Standard-ASCII und können möglicherweise mit Steuerzeichen verwechselt werden. Vielleicht ist es deshalb nur das Nullzeichen.

Sie können es selbst testen, indem Sie mit dem Texteditor vim Steuerzeichen in eine Textdatei einfügen. Wechseln Sie einfach in den Einfügemodus, drücken Sie Strg-V und dann das Steuerzeichen.

ein anderer Mann
quelle
2

Eine typische moderne grep-Implementierung sollte eine Datei nur dann als "binär" deklarieren, wenn sich keine Bytes darin befinden. Alles andere sollte in Ordnung sein.

Ich kann nicht für die von Ihnen verwendete grep-Implementierung sprechen ...

schily
quelle
1

Ein Codierungsfehler gemäß mbrlen () lässt GNU grep 2.24 ihn auch als binär betrachten

Z.B:

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

da \x80kann nicht das erste Byte eines UTF-8-Unicode-Punkts sein: https://en.wikipedia.org/wiki/UTF-8#Description

Dies ist die einzige andere Möglichkeit NUL.

grepInterpretation des GNU- Quellcodes, die zu dieser Schlussfolgerung führt: Warum betrachtet grep eine Datei als binär?

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