我有几个非常大的XML文件,我试图找到包含非ascii字符的行。我试过以下几种方法:
grep -e "[\x{00FF}-\x{FFFF}]" file.xml
但是这将返回文件中的每一行,而不管该行是否包含指定范围内的字符。
是我的语法错误还是我做错了什么?我也试过:
egrep "[\x{00FF}-\x{FFFF}]" file.xml
(在模式周围使用单引号和双引号)。
我有几个非常大的XML文件,我试图找到包含非ascii字符的行。我试过以下几种方法:
grep -e "[\x{00FF}-\x{FFFF}]" file.xml
但是这将返回文件中的每一行,而不管该行是否包含指定范围内的字符。
是我的语法错误还是我做错了什么?我也试过:
egrep "[\x{00FF}-\x{FFFF}]" file.xml
(在模式周围使用单引号和双引号)。
当前回答
下面的代码工作:
find /tmp | perl -ne 'print if /[^[:ascii:]]/'
将/tmp替换为要搜索的目录名。
其他回答
奇怪的是,我今天不得不这么做!我最终使用了Perl,因为我无法让grep/egrep工作(甚至在-P模式下)。喜欢的东西:
cat blah | perl -en '/\xCA\xFE\xBA\xBE/ && print "found"'
对于unicode字符(比如下面例子中的\u2212)使用:
find . ... -exec perl -CA -e '$ARGV = @ARGV[0]; open IN, $ARGV; binmode(IN, ":utf8"); binmode(STDOUT, ":utf8"); while (<IN>) { next unless /\N{U+2212}/; print "$ARGV: $&: $_"; exit }' '{}' \;
知道如何搜索一个unicode字符可能会很有趣。该命令可以提供帮助。你只需要知道UTF8的代码
grep -v $'\u200d'
在perl中
perl -ane '{ if(m/[[:^ascii:]]/) { print } }' fileName > newFile
不像上面大多数解决方案那样对非ASCII字符的字节范围进行假设,在我看来,明确ASCII字符的实际字节范围会稍微好一些。
所以第一个解决方案是:
grep --color='auto' -P -n '[^\x00-\x7F]' file.xml
(基本上greps十六进制ASCII范围以外的任何字符:从\x00到\x7F)
在Mountain Lion上,这将无法工作(由于BSD grep中缺乏PCRE支持),但通过Homebrew安装PCRE,以下将同样工作:
pcregrep --color='auto' -n '[^\x00-\x7F]' file.xml
大家能想到什么优点或缺点吗?
下面的代码工作:
find /tmp | perl -ne 'print if /[^[:ascii:]]/'
将/tmp替换为要搜索的目录名。