私が作業しているいくつかのコードには日本語で書かれたコメントがたくさんありますが、これを英語に翻訳しようとしています。日本語文字または少なくとも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プロパティ。渡すコマンドラインスイッチ-CSD
Perlは、すべてがUTF-8でエンコードされたUnicodeであることを伝えます。
perl -CSD -ne 'print if /\p{Hiragana}|\p{Katakana}/' myfile
ファイルがUTF-8でエンコードされていない場合は、以下を呼び出す必要があります。binmode
Perlにエンコーディングを明示的に教えてください。これはとても上品ですか?グローバルロケール私のための使用法。またはできますまず、その行をUTF-8に再エンコードしてください。。
あるいは、Perlでは数字の文字範囲を使用できます。たとえば、ひらがなとカタカナの Unicode ブロックから文字を検索するには、次のようにします。
perl -CSD -ne 'print if /[\x{3040}-\x{30ff}]/' a