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

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

然而,是否存在“非ASCII字符的任何字符”的正则表达式?

181186 次浏览

这将匹配一个非ascii字符:

[^\x00-\x7F]

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

你也可以使用POSIX的简写:

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

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

你也可以检查这个页面:Unicode正则表达式,因为它包含一些有用的Unicode字符类,比如:

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

你不需要正则表达式。

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

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

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

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

这是真正的ASCII:

 [^\x00-\x7F]

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

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

[^\w \xC0-\xFF]

Case ask,选项是多行

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

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

要验证文本框只接受Ascii码,请使用此模式

[\x00-\x7F]+

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