Ich habe eine große utf-8-Textdatei, mit der ich häufig suche grep
. Vor kurzem wurde grep
berichtet, 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, diff
da 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.
quelle
nul
und einigeEsc
s enthält. Ich habe versucht, nach ihnen zu greifen. Ich konnte dasesc
s (\x1B
) finden, aber das istnul
nie aufgetaucht. Der oben angegebene Test ergab 1 für die Linie, dieEsc
s enthält, aber nichts für einen Bereich, der nicht enthält\x1B
. Ich würde diesem Test nicht vertrauen. Versuchen Sie esgrep -zc .
stattdessen (sollte eins mehr sein als die Anzahl dernul
s in Ihrer Datei). (Auch könnten Sie besser dran sein[[:cntrl:]]
.)sed -z 's/.*\(....\)$/\1/' foo | od -c
einige Zeichen vor demNUL
(falls vorhanden) zu sehen, was Sie möglicherweise zu dem Problem führen könnte.sed
hat keine-z
Option :sed: invalid option -- 'z'
.Antworten:
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.
quelle
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 ...
quelle
Ein Codierungsfehler gemäß mbrlen () lässt GNU grep 2.24 ihn auch als binär betrachten
Z.B:
da
\x80
kann nicht das erste Byte eines UTF-8-Unicode-Punkts sein: https://en.wikipedia.org/wiki/UTF-8#DescriptionDies ist die einzige andere Möglichkeit
NUL
.grep
Interpretation des GNU- Quellcodes, die zu dieser Schlussfolgerung führt: Warum betrachtet grep eine Datei als binär?quelle