2010-12-04 87 views
4

我有一个文件,其中包含每6小时生成的aprox 12,000行。在其中一些行中,有非ascii字符。从Perl中的文件中删除包含非ASCII字符的行

我希望能够运行一个Perl脚本来删除其中包含非ASCII字符的所有行。

任何帮助,将不胜感激。

+2

为什么是适合销毁数据? – tchrist 2010-12-04 18:47:24

+4

@tchrist - 不确定OP的上下文,但是例如当文件需要被加载到非ascii的barf和业务需求不介意丢失行的软件中时(例如,加载部分文件好于没有),但是不要介意删除或编码非ascii字符(例如文件格式是基于位置的)会导致的损坏行。这是一个非常现实的场景,我不得不在我的工作中这样做。 – DVK 2010-12-04 21:07:11

回答

6

你可以这样做:

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

正则表达式解释/[^[:ascii:]]/

/开始的正则表达式
  [起始字符类的
  ^使这个字符类(一个匹配,除了什么是上市什么类)
    [:ascii:]任何ASCII字符
  ]字符类的末尾
/正则表达式的结束

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"; 
相关问题