193

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

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

4

9 回答 9

345

这将匹配单个非 ASCII 字符:

[^\x00-\x7F]

这是一个有效的PCREPerl 兼容的正则表达式)。

您还可以使用POSIX速记:

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

[^[:print:]]对你来说可能就足够了。**

于 2010-01-23T18:16:50.787 回答
40

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

这是真正的 ASCII:

 [^\x00-\x7F]

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

于 2012-11-19T09:18:38.670 回答
6

您还可以查看此页面:Unicode 正则表达式,因为它包含一些有用的 Unicode 字符类,例如:

\p{Control}:ASCII 0x00..0x1F 或 Latin-1 0x80..0x9F 控制字符。
于 2010-01-23T18:58:25.430 回答
3

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

[^\w \xC0-\xFF]

案例询问,选项是Multiline

于 2015-03-23T00:14:03.103 回答
3

[^\x00-\x7F][^[:ascii:]]错过一些控制字节,因此有时字符串可能是更好的选择。例如cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'会对你的终端做一些奇怪的事情,而 asstrings test.torrent会在哪里表现。

于 2016-03-03T03:53:46.800 回答
3

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

[\x00-\x7F]+

于 2018-05-30T19:28:33.080 回答
3

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

于 2019-01-21T17:19:49.973 回答
2

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

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

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

如果您没有任何匹配的文件,则 glob 将扩展为自身,除非您已nullglob设置。(表达式本身不匹配,所以从技术上讲,这个输出是明确的。)

于 2012-05-28T11:59:50.557 回答
1

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

于 2015-10-19T20:25:07.563 回答