フォルダをgrepし、ASCII以外の文字を含むすべての行を表示する方法はありますか?

フォルダをgrepし、ASCII以外の文字を含むすべての行を表示する方法はありますか?

私が作業しているいくつかのコードには日本語で書かれたコメントがたくさんありますが、これを英語に翻訳しようとしています。日本語文字または少なくともASCII以外の文字を含むすべての行を「grep」する方法はありますか?

ベストアンサー1

ASCII以外の文字を見つけるのは簡単です。 ASCII文字のみ有効なロケールを設定し、無効な文字を検索するだけです。

LC_CTYPE=C grep '[^[:print:]]' myfile

日本語文字を検索するには少し複雑です。 grepを使用する場合は、LC_CTYPEロケールがファイルのエンコードと一致することを確認する必要があります。LC_COLLATE文字範囲式を使用するには、設定が日本語に設定されていることも確認する必要があります。たとえば、Linuxでは(セクションを見て日本語と見なされる最初と最後の文字を決定しましたLC_COLLATE/usr/share/i18n/locales/ja_JP

LC_CTYPE=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8 egrep '[。-龥]' myfile

または、スクリプトでASCIIに固執したい場合

LC_CTYPE=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8 egrep $'[\uff61-\u9fa5]' myfile

これには、などの英語でも使用されるいくつかの句読点が含まれます×

Perlには文字分類機能が組み込まれています。あなたはそれを使用することができます\pキャラクタークラス以下に基づいて文字を一致させるUnicodeプロパティ。渡すコマンドラインスイッチ-CSDPerlは、すべてがUTF-8でエンコードされたUnicodeであることを伝えます。

perl -CSD -ne 'print if /\p{Hiragana}|\p{Katakana}/' myfile

ファイルがUTF-8でエンコードされていない場合は、以下を呼び出す必要があります。binmodePerlにエンコーディングを明示的に教えてください。これはとても上品ですか?グローバルロケール私のための使用法。またはできますまず、その行をUTF-8に再エンコードしてください。

あるいは、Perlでは数字の文字範囲を使用できます。たとえば、ひらがなとカタカナの Unicode ブロックから文字を検索するには、次のようにします。

perl -CSD -ne 'print if /[\x{3040}-\x{30ff}]/' a

おすすめ記事