grepを使用して、固定数の文字で文字列を照合します。

grepを使用して、固定数の文字で文字列を照合します。

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

grepPCREサポートで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

後者にはétudes7文字、8バイト、6文字があります。

答え3

この試み:

LC_ALL=C.UTF-8 grep -x '[_[:alnum:]]\{6\}' file

-xPOSIXで定義されているように、行全体を一致させるために使用されます(参照grep)。

バラよりここそれが何であるかについて良い説明を提供しますLC_ALL。 utf-8を設定LANGまたはLC_CTYPE使用して同じ動作を得ることができます。効果の順序はLC_ALL=> LANG=>ですLC_CTYPE

答え4

次のように試すことができます。

grep "^[A-Za-z]\{6\}$" myfile.txt

または、単語に数字を含めることができる場合:

grep "^[A-Za-z0-9]\{6\}$" myfile.txt

これに加えて、角かっこ内に必要な文字を追加するだけです。

関連情報