193

Linux には、多数のファイルを含むディレクトリがあります。ASCII 以外の文字を含むものもありますが、すべて有効なUTF-8です。1 つのプログラムにバグがあり、ASCII 以外のファイル名を扱うことができず、影響を受けるプログラムがいくつあるかを調べる必要があります。これを実行してからfindgrepを実行して非 ASCII 文字を出力し、次に aを実行しwc -lて番号を見つけようとしていました。grep である必要はありません。PerlsedAWKなどの標準的な Unix正規表現を使用できます。

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

4

9 に答える 9

345

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

[^\x00-\x7F]

これは有効なPCRE ( Perl 互換正規表現) です。

POSIX短縮形を使用することもできます。

  • [[:ascii:]]- 単一の ASCII 文字に一致
  • [^[:ascii:]]- 単一の非 ASCII 文字に一致

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

于 2010-01-23T18:16:50.787 に答える
40

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

これは実際の ASCII です。

 [^\x00-\x7F]

そうしないと、ASCII テーブルの一部である改行やその他の特殊文字が削除されます!

于 2012-11-19T09:18:38.670 に答える
6

このページを確認することもできます: Unicode 正規表現。次のような便利な Unicode 文字クラスが含まれています。

\p{Control}: ASCII 0x00..0x1F または Latin-1 0x80..0x9F 制御文字。
于 2010-01-23T18:58:25.430 に答える
3

[^\x00-\x7F][^[:ascii:]]一部の制御バイトが欠落しているため、文字がより適切なオプションになる場合があります。たとえば、 asが動作するcat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'端末に対して奇妙なことを行います。strings test.torrent

于 2016-03-03T03:53:46.800 に答える
2

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

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

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

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

于 2012-05-28T11:59:50.557 に答える