(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或预处理项目,最终将成为散列键。