私が作業しているいくつかのコードには日本語で書かれたコメントがたくさんありますが、これを英語に翻訳しようとしています。日本語文字または少なくとも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
答え2
この試み:
grep '[^[:print:][:space:]]'
(ロケールによっては、前に追加する必要がありますLANG=C
。)
答え3
Perlの使用が気に入らない場合は、クラスの形で広範なUnicodeサポートがあります。たとえば、Perl は、{Katakana}
一部の{Hiragana}
PCRE サポートを提供する grep バージョンでも現在これらのクラスを使用できないと思います。しかし、明示的なUTF-8デコードが必要なようです。
perl -MEncode -ne 'print if decode("UTF-8",$_) =~ /\p{Hiragana}/' somefile
grep の -R などのディレクトリを参照するには、find
次のコマンドを使用できます。
find -type f -exec perl -MEncode -ne 'print if decode("UTF-8",$_) =~ /\p{Hiragana}/' {} \;
filename:match
または再帰 grep のデフォルトトークン出力形式を模倣するには、
find -type f -exec perl -MEncode -lne 'printf "%s:%s\n",$ARGV,$_ if decode("UTF-8",$_) =~ /\p{Hiragana}/' {} \;
答え4
私のファイルはiso-8859-1エンコーディングなので、デフォルトのロケール(utf-8)から入力を読み取ろうとすると、日本語の文字が認識されません。最後に、次のコマンドを使用して問題を解決しました。
env LC_CTYPE=iso-8859-1 grep -nP '[\x80-\xff]' ./*
-P を使用すると、文字範囲で Perllike 構文を使用できます。
-n は、行名の横に行番号を印刷するために使用されます。
\x80
toは\xff
「非ASCII」文字です。
LC_CTYPE環境変数をiso-8859-1に変更すると、grepは私のフィールドをバイト単位で読み取り、「拡張ASCII」バイトを可能な日本語文字として検出できるようになりました。 UTF-8のデフォルトのシステムエンコーディングを使用すると、grepは「入力の無効なUTF-8バイトシーケンス」エラーで終了します。