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

在Linux上,我有一个包含大量文件的目录。 其中一些具有非ASCII字符,但都是有效的UTF-8 。 一个程序有一个错误,可以防止它使用非ASCII文件名,我必须找出有多less人受到影响。 我打算用find来做这个,然后用grep来打印非ASCII字符,然后用wc -l来find这个数字。 它不一定是grep; 我可以使用任何标准的Unix 正则expression式 ,比如Perl , sed , AWK等

但是,有没有一个“不是ASCII字符的任何字符”的正则expression式?

这将匹配一个非ASCII字符:

 [^\x00-\x7F] 

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

你也可以使用POSIX shorthands:

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

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

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

这是真正的ASCII:

  [^\x00-\x7F] 

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

您也可以检查此页面: Unicode正则expression式 ,因为它包含一些有用的Unicode字符类,如:

  \ p {Control}:ASCII 0x00..0x1F或Latin-1 0x80..0x9F控制字符。 

你真的不需要一个正则expression式。

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

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

如果您没有任何匹配的文件,glob将会扩展为无。

[^\x00-\x7F][^[:ascii:]]丢失一些控制字节,所以有时string可能是更好的select。 例如cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g' cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'会对你的terminal做些奇怪的事情,在那里strings test.torrent会performance出来。

你可以使用这个正则expression式:

 [^\w \xC0-\xFF] 

请问,选项是多行

这原来是非常灵活和可扩展的。 $ field =〜s / [^ \ x00- \ x7F] // g; #因此所有非ASCII或特定项目的问题可以清理。 非常好的select或预处理项目,最终将成为散列键。