我有几个非常大的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中
perl -ane '{ if(m/[[:^ascii:]]/) { print } }' fileName > newFile
这是我发现的另一个变体,它与grep搜索[\x80-\xFF]的结果完全不同。也许它会有用的人找到额外的非ascii字符:
grep -颜色= '汽车' - p - n”[^ [ascii:]]”myfile.txt
注意:我的电脑的grep (Mac)没有-P选项,所以我brew install grep,并使用ggrep而不是grep开始上面的调用。
以下是我的工作:
grep -P "[\x80-\xFF]" file.xml
非ascii字符从0x80开始,在查看字节时转到0xFF。Grep(和家族)不做Unicode处理,将多字节字符合并为一个实体,以便进行正则表达式匹配。我的grep中的-P选项允许在字符类中使用\xdd转义来实现您想要的效果。
奇怪的是,我今天不得不这么做!我最终使用了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 }' '{}' \;
最简单的方法是定义一个非ascii字符…作为非ASCII字符的字符。
LC_ALL=C grep '[^ -~]' file.xml
如果需要,在^后面添加一个制表符。
设置LC_COLLATE=C可以避免在许多地区中出现关于字符范围含义的令人讨厌的意外。必须设置LC_CTYPE=C以匹配单字节字符-否则该命令将错过当前编码中的无效字节序列。设置LC_ALL=C可以完全避免语言环境相关的影响。