6
を使用して単語のすべての文字を検索しますgrep
。私は現在これを持っています:
grep "^.\{6\}$" myfile.txt
しかし、次のような結果も得られた。étuis
、étude
。
e
私はこれが上記の引用の表記と関連していると思います。
これが起こらないようにするには、どのような措置を講じるべきですか?
ご協力ありがとうございます!
答え1
grep
キャラクターの考え地域によって異なります。 Unicodeではなくロケールにあり、Unicode文字を含むファイルからgrepする場合、文字数は一致しません。これにより、echo $LANG
現在存在するロケールが表示されます。
LC_CTYPE
および/または環境変数を「.UTF-8」で終わる値に設定すると、LANG
正しい動作が得られます。
$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$
コマンドと同じ行に変数を割り当てることで、個々のコマンドのロケールを変更できます。
この構成では、マルチバイト文字は単一文字として扱われます。 ASCII以外の文字を完全に除外するには、他の答えのいくつかが解決策を提供することがあります。
次の条件が存在する場合、誤動作が発生する可能性があります。または、予想されるものとまったく同じではない可能性があります。文字の組み合わせ。grep
ラテン語の小文字E + 急性文字を異なる方法で処理することができ、上記のラテン語の小文字のE + 急性文字を異なる方法で処理できます。
答え2
grep
PCREサポートでGNUを使用すると、次のことができます。
grep -Px '\X{6}'
.
文字を一致させるときは、\X
表の文字/文字を一致させます。
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文字があります。
答え3
答え4
次のように試すことができます。
grep "^[A-Za-z]\{6\}$" myfile.txt
または、単語に数字を含めることができる場合:
grep "^[A-Za-z0-9]\{6\}$" myfile.txt
これに加えて、角かっこ内に必要な文字を追加するだけです。