J'ai un grand fichier texte utf-8 avec lequel je recherche fréquemment grep
. Récemment, j'ai grep
commencé à signaler qu'il s'agissait d'un fichier binaire. Je peux continuer à le rechercher avec grep -a
, mais je me demandais avec quel changement il a décidé que le fichier était maintenant binaire.
J'ai une copie du mois dernier où le fichier n'est plus détecté comme binaire, mais ce n'est pas pratique pour diff
eux car ils diffèrent sur> 20 000 lignes.
file
identifie mon fichier comme
Texte anglais UTF-8 Unicode, avec de très longues lignes
Comment trouver les caractères / lignes / etc. dans mon fichier qui déclenchent ce changement?
La question similaire, non dupliquée 19907 couvre la possibilité de NUL mais grep -Pc '[\x00-\x1F]'
dit que je n'ai pas de NUL ou d'autres chaarcteurs de contrôle ANSI.
la source
nul
et quelquesEsc
s. J'ai essayé de les saluer. J'ai pu trouver leesc
s (\x1B
), mais lenul
ne s'est jamais présenté. Le test donné ci-dessus a montré 1, pour la ligne contenantEsc
s, mais rien pour une plage qui n'en contenait pas\x1B
. Je ne ferais pas confiance à ce test. Essayez à lagrep -zc .
place (devrait être un de plus que le nombre denul
s dans votre fichier). (En outre, il vaut peut-être mieux utiliser[[:cntrl:]]
.)sed -z 's/.*\(....\)$/\1/' foo | od -c
de voir quelques caractères avantNUL
(s'il y en a un), ce qui pourrait vous conduire au problème.sed
n'a pas l'-z
option:sed: invalid option -- 'z'
.Réponses:
Cela semble être la présence du caractère nul dans le fichier. (Affiché ^ @ généralement) J'ai entré divers caractères de contrôle dans un fichier texte (comme supprimer, ^ ?, par exemple), et seul le caractère nul a amené grep à le considérer un binaire. Cela n'a été testé que pour grep. Les commandes less et diff, par exemple, peuvent avoir des méthodes différentes. Les caractères de contrôle n'apparaissent en général que dans les binaires. Les exceptions sont les caractères d'espacement: saut de ligne (^ M), tabulation (^ I), saut de page (^ L), tabulation verticale (^ K) et retour (^ J).
Cependant, les caractères étrangers, comme les lettres arabes ou chinoises, ne sont pas des ascii standard et peuvent peut-être être confondus avec des caractères de contrôle. C'est peut-être pour cela que ce n'est que le caractère nul.
Vous pouvez le tester par vous-même en insérant des caractères de contrôle dans un fichier texte à l'aide de l'éditeur de texte vim. Passez simplement en mode insertion, appuyez sur control-v, puis sur le caractère de contrôle.
la source
Une implémentation grep moderne typique ne devrait déclarer un fichier "binaire" que s'il y a des octets nuls à l'intérieur. Tout le reste devrait être OK.
Je ne peux pas parler de l'implémentation grep que vous utilisez ...
la source
Une erreur de codage selon mbrlen () oblige également GNU grep 2.24 à le considérer comme binaire
Par exemple:
car
\x80
ne peut pas être le premier octet d'un point Unicode UTF-8: https://en.wikipedia.org/wiki/UTF-8#DescriptionC'est d'ailleurs la seule autre possibilité
NUL
.grep
Interprétation du code source GNU qui mène à cette conclusion: Qu'est - ce qui fait que grep considère un fichier comme binaire?la source