在Linux上,我有一个包含大量文件的目录。其中一些具有非ASCII字符,但它们都是有效的UTF-8。一个程序有一个错误,阻止它使用非ASCII文件名,我必须找出有多少受影响。我打算用find
执行此操作,然后执行grep打印非ASCII字符,然后执行wc -l
查找数字。它不一定是grep;我可以使用任何标准的Unix regular expression,例如Perl,sed,AWK等。
但是,是否存在“任何不是ASCII字符的字符”的正则表达式?
答案 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