2010-12-04 5 views
4

J'ai un fichier avec environ 12,000 lignes générées tous les 6 heures. Sur certaines de ces lignes, il y a des caractères non-ascii.Supprimer les lignes contenant des caractères non ASCII d'un fichier en Perl

Je voudrais être en mesure d'exécuter un script Perl pour supprimer toutes les lignes qui ont des caractères non-ASCII.

Toute aide serait appréciée.

+2

Pourquoi convient de détruire les données ? – tchrist

+4

@tchrist - Je ne suis pas sûr du contexte de l'OP, mais par exemple lorsque le fichier doit être chargé dans un logiciel qui ne fonctionne pas et que les exigences métier ne dérangent pas les lignes (par exemple, charger un fichier partiel vaut mieux que faites attention aux lignes tronquées qui résulteraient de la suppression ou de l'encodage de caractères non-ascii (par exemple, le format de fichier dépend de la position). C'est un scénario TRES réaliste, j'ai dû le faire dans mon travail. – DVK

Répondre

6

Vous pouvez faire:

perl -i.bak -ne 'print unless(/[^[:ascii:]]/)' file 

explication Regex pour /[^[:ascii:]]/:

/ début d'expression régulière
  [ début de classe de caractères
  ^ font un négatif classe de caractères (une classe qui correspond à quelque chose en plus ce qui est indiqué)
    [:ascii:] tout caractère ASCII
  ] fin de la classe de caractères
/ fin d'expression régulière

+0

Ne serait-ce pas '-i '*. Bak''? EDIT: Peu importe, ils sont équivalents – Cameron

+0

Juste essayé les deux, ils créent un fichier de sauvegarde nommé .bak mais le fichier original est maintenant rempli avec ⨪⨪⨪ 扭 牥> au lieu de données lisibles. EDIT: Si je convertis le fichier original de .txt en .html et exécute le code, il semble bien fonctionner. Pourquoi cela ne fonctionnerait-il pas sur un fichier .txt? –

1
#!/usr/bin/perl -p 
END {close STDOUT} 
use 5.010; 
use utf8; 
use strict; 
use autodie; 
use warnings qw<FATAL all>; 
use open qw<IN :bytes OUT :encoding(US-ASCII) :std>; 
BEGIN {$SIG{__WARN__}=sub{confess}} 
use sigtrap qw<stack-trace normal-signals error-signals>; 
use Carp; 
"disconcertingly"; 
Questions connexes