web-dev-qa-db-ja.com

(grep)非ASCII文字と一致する正規表現?

Linuxには、たくさんのファイルがあるディレクトリがあります。それらのいくつかは非ASCII文字を持っていますが、それらはすべて有効です TF-8 。 1つのプログラムには、ASCII以外のファイル名で動作するのを妨げるバグがあり、影響を受けるものの数を調べる必要があります。私はfindでこれを行い、非ASCII文字を出力するために grep を実行し、次にwc -lを実行して番号を見つけました。 grepである必要はありません。任意の標準Unix 正規表現 、たとえば PerlsedAWK などを使用できます。

ただし、「ASCII文字ではない任意の文字」の正規表現はありますか?

151
Rory

これは、単一の非ASCII文字と一致します。

[^\x00-\x7F]

これは有効な PCREPerl-Compatible Regular Expression)です。

POSIX の省略表現も使用できます。

  • [[:ascii:]]-単一のASCII charと一致します
  • [^[:ascii:]]-単一の非ASCII文字に一致

[^[:print:]]で十分でしょう。**

269
Alix Axel

いいえ、[^\x20-\x7E]はASCIIではありません。

これは本当のASCIIです:

 [^\x00-\x7F]

それ以外の場合は、ASCIIテーブルの一部である改行やその他の特殊文字を削除します!

35
Peter L

このページを確認することもできます。 nicode Regular Expressions 。次のような便利なUnicode文字クラスが含まれているためです。

\ p {Control}:ASCII 0x00..0x1FまたはLatin-1 0x80..0x9F制御文字。
5
Rubens Farias

[^\x00-\x7F]および[^[:ascii:]]はいくつかの制御バイトを逃します。そのため、 strings がより良いオプションになることがあります。たとえば、cat test.torrent | Perl -pe 's/[^[:ascii:]]+/\n/g'は端末に対して奇妙なことをしますが、strings test.torrentは振る舞います。

3
user1133275

正規表現は本当に必要ありません。

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

これにより、名前に制御文字が含まれるファイル名も表示されますが、これは機能だと思います。

一致するファイルがない場合、nullglobが設定されていない限り、グロブはそれ自体に展開されます。 (式はそれ自体と一致しないため、技術的には、この出力は明確です。)

2
tripleee

私は[^\t\r\n\x20-\x7E]+を使用していますが、それはうまく機能しているようです。

2
SolidSnakeUk89

次の正規表現を使用できます。

[^\w \xC0-\xFF]

オプションはMultilineです。

1
CypherPotato

これは非常に柔軟で拡張可能であることがわかりました。 $ field =〜s/[^\x00-\x7F] // g; #したがって、すべての非ASCIIまたは問題の特定のアイテムをクリーニングできます。最終的にハッシュキーになるアイテムの選択または前処理のいずれかで非常に素晴らしい。

1
Don Turnblade

テキストボックスを検証するにはAsciiのみがこのパターンを使用します

[\x00-\x7F]+

1
Othman Mahmoud