を6
使用してすべての文字の単語を検索しようとしていますgrep
。私は現在これを持っています:
grep "^.\{6\}$" myfile.txt
:しかし、私はまたのような結果を取得していますことを発見していますétuis
、étude
。
e
上記の言葉の上の記号に何か関係があると思います。
これが起こらないようにするために私ができることはありますか?
ご協力いただきありがとうございます!
を6
使用してすべての文字の単語を検索しようとしていますgrep
。私は現在これを持っています:
grep "^.\{6\}$" myfile.txt
:しかし、私はまたのような結果を取得していますことを発見していますétuis
、étude
。
e
上記の言葉の上の記号に何か関係があると思います。
これが起こらないようにするために私ができることはありますか?
ご協力いただきありがとうございます!
回答:
grep
キャラクターのアイデアはロケールに依存します。Unicode以外のロケールを使用していて、Unicode文字が含まれているファイルからgrepを実行すると、文字数が一致しなくなります。あなたがいる場合echo $LANG
、あなたはあなたがしているロケールが表示されます。
LC_CTYPE
および/またはLANG
環境変数を「.UTF-8」で終わる値に設定すると、正しい動作が得られます。
$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$
コマンドと同じ行に変数を割り当てることにより、単一のコマンドのロケールを変更できます。
この構成では、マルチバイト文字は単一の文字と見なされます。非ASCII文字を完全に除外したい場合は、他の回答のいくつかに解決策があります。
結合文字がある場合でも、物事が壊れる可能性があるか、少なくとも期待どおりに動作しない可能性があることに注意してください。あなたのgrep
LATIN SMALL LETTER E +は違っLATIN SMALL LETTER Eを伴う急性よりCHARACTER ACUTE ABOVEを組み合わせて処理することができます。
'
「文字数が固定された文字列」の一部として合理的に使用できる文字です。
LC_CTYPE
とLANG
、のようなものはLC_CTYPE=en_US.UTF-8 LANG=en_US
失敗します。LC_ALL
安全のために使用してください。
grep
PCREサポートを使用してビルドしたGNU では、次のことができます。
grep -Px '\X{6}'
一方で.
一致した文字、\X
表意文字/ graphemと一致します。
UTF-8ロケールの場合:
$ locale charmap
UTF-8
$ printf '\u00e9tuis\n\u00e9tudes\n' | grep -Px '\X{6}'
études
$ printf 'e\u0301tuis\ne\u0301tudes\n' | grep -Px '\X{6}'
études
後者études
には、7文字、8バイト、6つの書記があります。
echo épée | grep -Px '\X{6}'
ouputépée
é
上記のロケールがUTF-8でエンコードされている場合)。
.
、次のようなものwăsd's
が一致します