(grep)正则表达式匹配非ASCII字符?

时间:2010-01-23 17:34:28

标签: regex unicode grep ascii

在Linux上,我有一个包含大量文件的目录。其中一些具有非ASCII字符,但它们都是有效的UTF-8。一个程序有一个错误,阻止它使用非ASCII文件名,我必须找出有多少受影响。我打算用find执行此操作,然后执行grep打印非ASCII字符,然后执行wc -l查找数字。它不一定是grep;我可以使用任何标准的Unix regular expression,例如PerlsedAWK等。

但是,是否存在“任何不是ASCII字符的字符”的正则表达式?

9 个答案:

答案 0 :(得分:258)

这将匹配单个非ASCII字符:

[^\x00-\x7F]

这是有效的PCRE Perl兼容的正则表达式)。

您还可以使用POSIX短片:

  • [[:ascii:]] - 匹配单个ASCII字符
  • [^[:ascii:]] - 匹配单个非ASCII字符

[^[:print:]]可能就足够了。**

答案 1 :(得分:33)

不,[^\x20-\x7E]不是ASCII。

这是真正的ASCII:

 [^\x00-\x7F]

否则,它将修剪掉作为ASCII表一部分的换行符和其他特殊字符!

答案 2 :(得分:5)

您还可以查看此页面:Unicode Regular Expressions,因为它包含一些有用的Unicode字符类,例如:

\p{Control}: an ASCII 0x00..0x1F or Latin-1 0x80..0x9F control character.

答案 3 :(得分:2)

你真的不需要正则表达式。

printf "%s\n" *[!\ -~]*

这将显示名称中包含控制字符的文件名,但我认为这是一个功能。

如果您没有任何匹配的文件,除非您设置了nullglob,否则glob将扩展为自身。 (表达式与自身不匹配,因此从技术上讲,此输出是明确的。)

答案 4 :(得分:2)

[^\x00-\x7F][^[:ascii:]]错过了一些控制字节,因此有时strings可能是更好的选择。例如,cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'会对您的终端执行奇怪的操作,而strings test.torrent的行为将会出现。

答案 5 :(得分:2)

我使用[^\t\r\n\x20-\x7E]+,看来工作正常。

答案 6 :(得分:1)

您可以使用此正则表达式:

[^\w \xC0-\xFF]

案例询问,选项是多行

答案 7 :(得分:1)

结果证明这是非常灵活和可扩展的。 $ field = ~s / [^ \ x00- \ x7F] // g; #因此可以清除所有非ASCII或特定项目。非常好的选择或预处理最终将成为哈希键的项目。

答案 8 :(得分:1)

验证文本框接受Ascii仅使用此模式

production