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


9

6使用してすべての文字の単語を検索しようとしていますgrep。私は現在これを持っています:

grep "^.\{6\}$" myfile.txt 

:しかし、私はまたのような結果を取得していますことを発見していますétuisétude

e上記の言葉の上の記号に何か関係があると思います。

これが起こらないようにするために私ができることはありますか?

ご協力いただきありがとうございます!

回答:


4

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文字を完全に除外したい場合は、他の回答のいくつかに解決策があります。


結合文字がある場合でも、物事が壊れる可能性があるか、少なくとも期待どおりに動作しない可能性があることに注意してください。あなたのgrepLATIN SMALL LETTER E +は違っLATIN SMALL LETTER Eを伴う急性よりCHARACTER ACUTE ABOVEを組み合わせて処理することができます。


を使用すると.、次のようなものwăsd'sが一致します
cuonglm '31 / 07/31

'「文字数が固定された文字列」の一部として合理的に使用できる文字です。
Michael Homer

多分。そして、あなたは両方を設定する必要がありますLC_CTYPELANG、のようなものはLC_CTYPE=en_US.UTF-8 LANG=en_US失敗します。LC_ALL安全のために使用してください。
cuonglm 14

2

これを試して:

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

-x行全体を照合するために使用し、POSIXによって定義されます(grepを参照)。

何が行われるかについては、こちらをご覧くださいLC_ALL。utf-8を設定LANGまたはLC_CTYPE使用して、同じ動作を得ることができます。影響を受ける順序はLC_ALL=> LANG=> LC_CTYPEです。


2

grepPCREサポートを使用してビルドした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
cuonglm '31 / 07/31

@Gnouc、それをUTF-8ロケールで実行する必要があります(é上記のロケールがUTF-8でエンコードされている場合)。
ステファンChazelas

ああ、私の間違い。UTF-8で動作します。
cuonglm 2014

0

あなたは次のようなことを試すことができます:

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

または、単語に数字も含まれる場合は、次のようにします。

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

これらに加えて、角括弧に任意の文字を追加するだけです。


étudeアクセントに対応するASCII文字が正規表現を台無しにするので、これはまったく一致しません。
アレックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.