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

Posted

技术标签:

【中文标题】(grep)正则表达式匹配非ASCII字符?【英文标题】:(grep) Regex to match non-ASCII characters? 【发布时间】:2011-01-08 14:27:39 【问题描述】:

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

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

【问题讨论】:

保罗,是的,我可以使用 perl /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F] 【参考方案1】:

这将匹配单个非 ASCII 字符:

[^\x00-\x7F]

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

您也可以使用POSIX 速记:

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

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

【讨论】:

@adrianm: 不,^ 在 PCRE 中有效。 完全正确。但是,您必须使用 pcregrep,而不是标准 grep。如果您的终端设置为 UTF8,[^[:print:]] 将不起作用。 @Rory,为什么:print: 不能在 UTF8 终端中工作?这在 UTF8 终端中对我有用:27.chr =~ /[^[:print:]]/ 这对于修复错误的文件名非常有用 - rename 's/[^\x00-\x7F]//g' *(您可以先使用 -n 检查重命名是否正常)。 如何匹配任何非 UTF8 字符和任何其他特定字符?【参考方案2】:

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

\pControl:ASCII 0x00..0x1F 或 Latin-1 0x80..0x9F 控制字符。

【讨论】:

standard grep does not support those.【参考方案3】:

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

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

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

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

【讨论】:

迟来的,如果您确实有一些与此模式匹配的文件,我可以观察到此 确实 可以正常工作。当没有匹配时,模式打印自己的行为有点令人惊讶,但实际上是正确的。我编辑了答案,希望能澄清这一点。 请注意,行为取决于当前的 bash 设置。我建议shopt -s nullglob dotglob globasciiranges 跳过不匹配的模式,包括像.tmp§ 这样的点文件名,而不是依赖于当前的语言环境。我的意思是只为这个特定的命令临时设置它,否则默认设置就可以了。【参考方案4】:

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

这是真正的 ASCII:

 [^\x00-\x7F]

否则,它将删除换行符和其他属于 ASCII 表的特殊字符!

【讨论】:

【参考方案5】:

你可以使用这个正则表达式:

[^\w \xC0-\xFF]

案例询问,选项是Multiline

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

[^\x00-\x7F][^[:ascii:]] 缺少一些控制字节,所以 strings 有时可能是更好的选择。例如cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g' 会对你的终端做一些奇怪的事情,而strings test.torrent 会表现得很好。

【讨论】:

【参考方案8】:

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

[\x00-\x7F]+

【讨论】:

【参考方案9】:

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

【讨论】:

以上是关于(grep)正则表达式匹配非ASCII字符?的主要内容,如果未能解决你的问题,请参考以下文章

linux grep 正则表达式

用InDesign的你还不懂的贪婪和非贪婪匹配?OUT啦『GREP正则表达式』

Linux正则表达式

linux正则表达式

Linux正则表达式

正则表达式解析 & awk/sed/grep实用实例总结文档