Linuxには、たくさんのファイルがあるディレクトリがあります。それらのいくつかは非ASCII文字を持っていますが、それらはすべて有効です TF-8 。 1つのプログラムには、ASCII以外のファイル名で動作するのを妨げるバグがあり、影響を受けるものの数を調べる必要があります。私はfind
でこれを行い、非ASCII文字を出力するために grep を実行し、次にwc -l
を実行して番号を見つけました。 grepである必要はありません。任意の標準Unix 正規表現 、たとえば Perl 、 sed 、 AWK などを使用できます。
ただし、「ASCII文字ではない任意の文字」の正規表現はありますか?
いいえ、[^\x20-\x7E]
はASCIIではありません。
これは本当のASCIIです:
[^\x00-\x7F]
それ以外の場合は、ASCIIテーブルの一部である改行やその他の特殊文字を削除します!
このページを確認することもできます。 nicode Regular Expressions 。次のような便利なUnicode文字クラスが含まれているためです。
\ p {Control}:ASCII 0x00..0x1FまたはLatin-1 0x80..0x9F制御文字。
[^\x00-\x7F]
および[^[:ascii:]]
はいくつかの制御バイトを逃します。そのため、 strings がより良いオプションになることがあります。たとえば、cat test.torrent | Perl -pe 's/[^[:ascii:]]+/\n/g'
は端末に対して奇妙なことをしますが、strings test.torrent
は振る舞います。
正規表現は本当に必要ありません。
printf "%s\n" *[!\ -~]*
これにより、名前に制御文字が含まれるファイル名も表示されますが、これは機能だと思います。
一致するファイルがない場合、nullglob
が設定されていない限り、グロブはそれ自体に展開されます。 (式はそれ自体と一致しないため、技術的には、この出力は明確です。)
私は[^\t\r\n\x20-\x7E]+
を使用していますが、それはうまく機能しているようです。
次の正規表現を使用できます。
[^\w \xC0-\xFF]
オプションはMultilineです。
これは非常に柔軟で拡張可能であることがわかりました。 $ field =〜s/[^\x00-\x7F] // g; #したがって、すべての非ASCIIまたは問題の特定のアイテムをクリーニングできます。最終的にハッシュキーになるアイテムの選択または前処理のいずれかで非常に素晴らしい。
テキストボックスを検証するにはAsciiのみがこのパターンを使用します
[\x00-\x7F]+