我有几个很是大的XML文件,正在尝试查找包含非ASCII字符的行。 我尝试了如下方法: 正则表达式
grep -e "[\x{00FF}-\x{FFFF}]" file.xml
但这将返回文件中的每一行,不管该行是否包含指定范围内的字符。 less
个人语法有误仍是作错了其余事情? 我也尝试过: 编码
egrep "[\x{00FF}-\x{FFFF}]" file.xml
(用单引号和双引号将模式引发来)。 spa
像上面的大多数解决方案同样,与其对非ASCII字符的字节范围进行假设,不如对ASCII字符的实际字节范围进行明确说明,IMO更好。 code
所以,第一个解决方案例如将变为: xml
grep --color='auto' -P -n '[^\x00-\x7F]' file.xml
(基本上,对于十六进制ASCII范围以外的任何字符,它都会发出声音:从\\ x00到\\ x7F) ci
在不起做用的Mountain Lion上(因为BSD grep中缺乏PCRE支持) ,可是经过Homebrew安装了pcre
,如下内容一样适用: unicode
pcregrep --color='auto' -n '[^\x00-\x7F]' file.xml
任何人均可以考虑的利弊? it
奇怪的是,我今天必须这样作! 我最终使用Perl是由于我没法使grep / egrep正常工做(即便在-P模式下也是如此)。 就像是: io
cat blah | perl -en '/\xCA\xFE\xBA\xBE/ && print "found"'
对于unicode字符(例以下面的示例中的\−
),请使用如下命令:
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 }' '{}' \;
如下对我有用:
grep -P "[\x80-\xFF]" file.xml
非ASCII字符从0x80开始,在查看字节时变为0xFF。 Grep(和家族)不执行Unicode处理,以将多字节字符合并为单个实体以进行正则表达式匹配。 个人grep中的-P
选项容许在字符类中使用\\xdd
转义符来完成所需的操做。
最简单的方法是将非ASCII字符定义为不是ASCII字符的字符。
LC_ALL=C grep '[^ -~]' file.xml
若有必要,在^
后面添加一个标签。
设置LC_COLLATE=C
能够避免在许多语言环境中出现使人讨厌的字符范围含义。 必须设置LC_CTYPE=C
来匹配单字节字符-不然该命令将丢失当前编码中的无效字节序列。 设置LC_ALL=C
能够彻底避免区域设置相关的影响。
这是我发现的另外一个变体,它与接受的答案中的[\\x80-\\xFF]
的grep搜索产生的结果彻底不一样。 也许对找到其余非ASCII字符的人有用:
grep --color='auto' -P -n "[^[:ascii:]]" myfile.txt
注意:个人计算机的grep(苹果机)没有-P
选项,所以我进行了brew install grep
并使用ggrep
而不是grep
开始了上述调用。