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


169

Linuxでは、多くのファイルを含むディレクトリがあります。一部には非ASCII文字がありますが、すべて有効なUTF-8です。1つのプログラムにバグがあり、ASCII以外のファイル名で機能しないため、影響を受けるファイルの数を調べる必要があります。私はこれを使ってこれを行いfind、次にgrepを実行して非ASCII文字を出力し、次にa wc -lを実行して数字を見つけていました。grepである必要はありません。私は、任意の標準的なUnix使用できる正規表現のように、PerlのsedはAWKなどを、

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


1
ポール、はい、私はperlを使用できます
Rory

/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
Tinmarino

回答:


310

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

[^\x00-\x7F]

これは有効なPCREPerl互換の正規表現)です。

POSIX省略形を使用することもできます。

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

[^[:print:]] おそらくあなたのために十分でしょう。**


3
@adrianm:いいえ、^PCREで有効です。
Alix Axel

10
その通りです。ただし、標準のgrepではなくpcregrepを使用する必要があります。[^ [:print:]]は、端末がUTF8で設定されている場合は機能しません。
Rory

@Rory、なぜ:print:UTF8端末で動作しないのですか?UTF8ターミナルにおけるてこで私にとってはこの作品:27.chr =~ /[^[:print:]]/
akostadinov

これは、不正なファイル名を修正する場合に非常に便利ですrename 's/[^\x00-\x7F]//g' *-n最初に名前の変更に問題がないかどうかを確認するために使用できます)。
naught101

UTF8以外の文字と他の特定の文字を一致させるにはどうすればよいですか?
CMCDragonkai 2016年

37

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

これは実際のASCIIです。

 [^\x00-\x7F]

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



3

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



3

私が使用[^\t\r\n\x20-\x7E]+していますが、問題なく動作しているようです。


2

あなたはこの正規表現を使うことができます:

[^\w \xC0-\xFF]

場合によっては、オプションはMultilineです。


2

あなたは本当に正規表現を必要としません。

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

これにより、名前に制御文字が含まれるファイル名も表示されますが、私はその機能を検討しています。

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


遅ればせながら、このパターンに一致するファイルが実際にある場合、これ正しく機能することがわかります。一致がない場合にパターンがそれ自体を印刷する動作は、少し意外ですが実際には正しいです。うまくいけばこれを明確にするために私は答えを編集しました。
tripleee

1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.