web-dev-qa-db-fra.com

ASCII vérificateur de fichier source

Pour la documentation officielle Ubuntu où les fichiers sources anglais sont dans docbook xml, il est nécessaire d'utiliser uniquement ASCII caractères. Nous utilisons une ligne de commande "checker" (voir here ).

grep --color='auto' -P -n "[\x80-\xFF]" *.xml

Cependant, la commande a une faille, apparemment pas sur tous les ordinateurs, elle manque quelques lignes avec des caractères non-ASCII, ce qui peut entraîner un faux O.K. résultat.

Quelqu'un a-t-il une meilleure suggestion pour une ligne de commande du vérificateur ASCII?

Les personnes intéressées pourraient envisager d'utiliser ce fichier (fichier texte, pas un fichier docbook xml) comme scénario de test. Les trois premières lignes avec des caractères non ASCII sont les lignes 9, 14 et 18. Les lignes 14 et 18 ont été omises lors de la vérification:

$ grep --color='auto' -P -n "[\x80-\xFF]" install.en.txt | head -13
9:Appendix F, GNU General Public License.
330:when things go wrong. The Installation Howto can be found in Appendix A,
337:Chapter 1. Welcome to Ubuntu
359:1.1. What is Ubuntu?
394:1.1.1. Sponsorship by Canonical
402:1.2. What is Debian?
456:1.2.1. Ubuntu and Debian
461:1.2.1.1. Package selection
475:1.2.1.2. Releases
501:1.2.1.3. Development community
520:1.2.1.4. Freedom and Philosophy
534:1.2.1.5. Ubuntu and other Debian derivatives
555:1.3. What is GNU/Linux?
3
Doug Smythies

Si vous souhaitez rechercher des caractères non-ASCII, vous devriez peut-être inverser la recherche pour exclure les caractères ASCII:

grep -Pn '[^\x00-\x7F]'

Par exemple:

$ curl https://help.ubuntu.com/16.04/installation-guide/AMD64/install.en.txt -s | grep -nP '[^\x00-\x7F]' | head
9:Appendix F, GNU General Public License.
14:(codename "‘Xenial Xerus’"), for the 64-bit PC ("AMD64") architecture. It also
18:━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
330:when things go wrong. The Installation Howto can be found in Appendix A,
337:Chapter 1. Welcome to Ubuntu
359:1.1. What is Ubuntu?
368:  • Ubuntu will always be free of charge, and there is no extra fee for the "
372:  • Ubuntu includes the very best in translations and accessibility
376:  • Ubuntu is shipped in stable and regular release cycles; a new release will
380:  • Ubuntu is entirely committed to the principles of open source software

Aux lignes 9, 330, 337 et 359, Les espaces Unicode non majuscules sont présents.


La sortie particulière que vous obtenez est peut-être due au support de UTF-8 par grep. Pour les paramètres régionaux Unicode, certains de ces caractères peuvent être comparés égaux à un caractère normal ASCII. Forcer les paramètres régionaux C affichera les résultats attendus dans ce cas:

$ LANG=C grep -Pn '[\x80-\xFF]' install.en.txt| head
9:Appendix F, GNU General Public License.
14:(codename "‘Xenial Xerus’"), for the 64-bit PC ("AMD64") architecture. It also
18:━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
330:when things go wrong. The Installation Howto can be found in Appendix A,
337:Chapter 1. Welcome to Ubuntu
359:1.1. What is Ubuntu?
368:  • Ubuntu will always be free of charge, and there is no extra fee for the "
372:  • Ubuntu includes the very best in translations and accessibility
376:  • Ubuntu is shipped in stable and regular release cycles; a new release will
380:  • Ubuntu is entirely committed to the principles of open source software

$ LANG=en_GB.UTF-8 grep -Pn '[\x80-\xFF]' install.en.txt| head
9:Appendix F, GNU General Public License.
330:when things go wrong. The Installation Howto can be found in Appendix A,
337:Chapter 1. Welcome to Ubuntu
359:1.1. What is Ubuntu?
394:1.1.1. Sponsorship by Canonical
402:1.2. What is Debian?
456:1.2.1. Ubuntu and Debian
461:1.2.1.1. Package selection
475:1.2.1.2. Releases
501:1.2.1.3. Development community
4
muru

Vous pouvez imprimer toutes les lignes non-ASCII d'un fichier en utilisant mon script Python 3 que j'héberge sur GitHub ici:

GitHub: ByteCommander/encoding-check

Vous pouvez soit cloner, soit télécharger l'intégralité du référentiel, soit simplement enregistrer le fichier encoding-check et le rendre exécutable à l'aide de _chmod +x encoding-check_.

Ensuite, vous pouvez l'exécuter comme ceci, avec le fichier à vérifier comme seul argument:

  • ./encoding-check FILENAME s'il se trouve dans votre répertoire de travail actuel ou ...
  • /path/to/encoding-check FILENAME s'il est situé dans _/path/to/_, ou ...
  • encoding-check FILENAME s'il se trouve dans un répertoire qui fait partie de la variable d'environnement _$PATH_, c'est-à-dire _/usr/local/bin_ ou _~/bin_.

Sans aucun argument optionnel, il imprimera chaque ligne et son numéro là où il a trouvé des caractères non-ASCII. Enfin, une ligne récapitulative vous indique le nombre total de lignes du fichier et le nombre de lignes contenant des caractères non-ASCII.

Il est garanti que cette méthode décode correctement tous les caractères ASCII et détecte tout ce qui n'est définitivement pas ASCII.

Voici un exemple exécuté sur un fichier contenant les 20 premières lignes de votre _install.en.txt_ donné:

_$ ./encoding-check install-first20.en.txt
     9: Appendix��F, GNU General Public License.
    14: (codename "���Xenial Xerus���"), for the 64-bit PC ("AMD64") architecture. It also
    18: ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
--------------------------------------------------------------------------------
20 lines in 'install-first20.en.txt', thereof 3 lines with non-ASCII characters.
_

Mais le script a quelques arguments supplémentaires pour modifier le codage vérifié et le format de sortie. Voir l'aide et essayez-les:

_$ encoding-check -h
usage: encoding-check [-h] [-e ENCODING] [-s | -c | -l] [-m] [-w] [-n] [-f N]
                     [-t]
                     FILE [FILE ...]

Show all lines of a FILE containing characters that don't match the selected
ENCODING.

positional arguments:
  FILE                  the file to be examined

optional arguments:
  -h, --help            show this help message and exit
  -e ENCODING, --encoding ENCODING
                        file encoding to test (default 'ascii')
  -s, --summary         only print the summary
  -c, --count           only print the detected line count
  -l, --lines           only print the detected lines
  -m, --only-matching   hide files without matching lines from output
  -w, --no-warnings     hide warnings from output
  -n, --no-numbers      do not show line numbers in output
  -f N, --fit-width N   trim lines to N characters, or terminal width if N=0;
                        non-printable characters like tabs will be removed
  -t, --title           print title line above each file
_

En tant que _--encoding_, chaque codec que Python 3 connaît est valide. Essayez-en un, dans le pire des cas, vous obtenez un petit message d'erreur ...

4
Byte Commander

Cette commande Perl remplace la plupart du temps cette commande grep (la chose manquante étant les couleurs):

Perl -ne '/[\x80-\xFF]/&&print($ARGV."($.):\t^".$_)' *.xml
  • n: Perl assume la boucle suivante autour de votre programme, ce qui le rend itératif sur les arguments de nom de fichier un peu comme sed -n ou awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
    
  • -e: peut être utilisé pour entrer une ligne de programme.
  • /[\x80-\xFF]/&&print($ARGV."($.):\t^".$_): si la ligne contient un caractère compris dans la plage \x80-\xFF, imprime le nom du fichier en cours, son numéro de ligne, une chaîne :\t^ et le contenu de la ligne en cours.

Sortie sur un répertoire exemple contenant le fichier exemple dans la question et un fichier contenant uniquement ààààà et un caractère de nouvelle ligne:

% Perl -ne '/[\x80-\xFF]/&&print($ARGV."($.):\t^".$_)' file | head -n 10
file(9):    ^Appendix F, GNU General Public License.
file(14):   ^(codename "‘Xenial Xerus’"), for the 64-bit PC ("AMD64") architecture. It also
file(18):   ^â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”
file(330):  ^when things go wrong. The Installation Howto can be found in Appendix A, 
file(337):  ^Chapter 1. Welcome to Ubuntu
file(359):  ^1.1. What is Ubuntu?
file(368):  ^  • Ubuntu will always be free of charge, and there is no extra fee for the "
file(372):  ^  • Ubuntu includes the very best in translations and accessibility
file(376):  ^  • Ubuntu is shipped in stable and regular release cycles; a new release will
file(380):  ^  • Ubuntu is entirely committed to the principles of open source software
% Perl -ne '/[\x80-\xFF]/&&print($ARGV."($.):\t^".$_)' file1
file1(1):   ^ààààà
2
kos