Dizeyi grep kullanarak sabit sayıda karakterle eşleştirme


9

6Kullanarak tüm harf kelimeleri bulmaya çalışıyorum grep. Şu anda bu var:

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

Ancak, ben de şöyle sonuçlar alıyorum buluyorum: étuis, étude.

eYukarıdaki kelimelerde yukarıdaki sembollerle ilgili bir şey olduğundan şüpheleniyorum .

Bunun olmamasını sağlamak için yapabileceğim bir şey var mı?

Yardımın için teşekkürler!

Yanıtlar:


4

grepkarakterinin fikri yerel ayara bağlıdır . Unicode olmayan bir yerdeyseniz ve içinde Unicode karakterleri olan bir dosyadan grep yaparsanız, karakter sayıları eşleşmez. Eğer echo $LANGo zaman içinde bulunduğunuz yerel ayarı göreceksiniz.

Eğer ayarlarsanız LC_CTYPEve / veya LANG".UTF-8" O zaman doğru davranışı alacak ile biten bir değere Ortam değişkenlerini:

$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$

Değişkeni komutla aynı satıra atayarak yerel ayarınızı tek bir komut için değiştirebilirsiniz.

Bu yapılandırmada, çok baytlı karakterler tek karakter olarak kabul edilir. ASCII dışı karakterleri tamamen hariç tutmak istiyorsanız, diğer yanıtların bazılarının sizin için çözümleri vardır.


Karakterlerin bir araya gelmesi durumunda, işlerin kırılmasının veya en azından beklediğiniz şeyi yapmamasının hala mümkün olduğunu unutmayın . Sizin grepfarklı LATİN KÜÇÜK MEKTUP E İLE AKUT daha KARAKTER AKUT YUKARIDAKİ KOŞULLARI BİRLEŞTİRİLMESİ LATİN KÜÇÜK MEKTUP E + ele alabilir.


kullanırsanız ., benzer bir şey wăsd'seşleşir
cuonglm

'"sabit sayıda karakter içeren bir dizenin" parçası olabilen bir karakter olabilir.
Michael Homer

Olabilir. Ve ikisini de ayarlamanız gerekir LC_CTYPEve LANGbenzer bir şey LC_CTYPE=en_US.UTF-8 LANG=en_USbaşarısız olur. LC_ALLGüvenlik için kullanın .
cuonglm

2

Bunu dene:

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

-xtüm satırı eşleştirmek için kullanın ve POSIX ile tanımlayın (Bkz. grep ).

Nelerin iyi bir açıklaması için buraya bakın LC_ALL. Aynı davranışı elde etmek için utf-8 ayarlayabilir LANGveya LC_CTYPEkullanabilirsiniz. Etkilenen sipariş LC_ALL=> LANG=> LC_CTYPE.


2

grepPCRE desteği ile oluşturulduğunda GNU ile şunları yapabilirsiniz:

grep -Px '\X{6}'

İken .maçları bir karakterin, \Xbir ideogramdır / graphem eşleşir.

UTF-8 yerel ayarında:

$ 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

Bu sonuncusunda études7 karakter, 8 bayt ve 6 grafik var.


: O değil çalışır görünüyor echo épée | grep -Px '\X{6}'çıkışınaépée
cuonglm

@Gnouc, bunu bir UTF-8 yerel ayarında çalıştırmanız gerekir ( éyukarıdakiler UTF-8 olarak kodlanmışsa).
Stéphane Chazelas

Hatalar. UTF-8 ile çalışır.
cuonglm

0

Şöyle bir şey deneyebilirsiniz:

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

veya kelimeler de sayılar içeriyorsa:

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

Bunlara ek olarak istediğiniz köşeli parantezlere herhangi bir karakter eklemeniz yeterlidir.


étudeAksine karşılık gelen ASCII karakteri normal ifadeyi dağıtacağından, bu hiçbiriyle eşleşmez .
Alex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.