grep
Gagasan karakter bergantung pada lokal . Jika Anda berada di lokal non-Unicode dan Anda mengambil dari file dengan karakter Unicode di dalamnya maka jumlah karakter tidak akan cocok. Jika Anda echo $LANG
maka Anda akan melihat tempat Anda berada.
Jika Anda mengatur variabel lingkungan LC_CTYPE
dan / atau LANG
ke nilai yang diakhiri dengan ".UTF-8" maka Anda akan mendapatkan perilaku yang benar:
$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$
Anda dapat mengubah lokal hanya untuk satu perintah dengan menetapkan variabel pada baris yang sama dengan perintah.
Dengan konfigurasi ini, karakter multi-byte dianggap sebagai karakter tunggal. Jika Anda ingin mengecualikan karakter non-ASCII sepenuhnya, beberapa jawaban lain memiliki solusi untuk Anda.
Perhatikan bahwa masih mungkin hal-hal untuk dipecahkan, atau setidaknya tidak melakukan apa yang Anda harapkan, dengan adanya penggabungan karakter . Anda grep
dapat memperlakukan SURAT KECIL LATIN E + KARAKTER GABUNGAN AKUT DI ATAS berbeda dari SURAT KECIL LATIN E DENGAN AKUT.
.
, sesuatu sepertiwăsd's
akan cocok'
adalah karakter yang dapat secara wajar menjadi bagian dari "string dengan jumlah karakter tetap".LC_CTYPE
danLANG
, sesuatu sepertiLC_CTYPE=en_US.UTF-8 LANG=en_US
akan gagal. GunakanLC_ALL
untuk keamanan.Coba ini:
-x
gunakan untuk mencocokkan seluruh baris, dan didefinisikan oleh POSIX (Lihat grep ).Lihat di sini untuk penjelasan yang baik tentang apa yang
LC_ALL
dilakukan. Anda dapat mengaturLANG
atauLC_CTYPE
menggunakan utf-8 untuk mendapatkan perilaku yang sama. Pengaruh pengambilan pesanan adalahLC_ALL
=>LANG
=>LC_CTYPE
.sumber
Dengan GNU
grep
saat dibangun dengan dukungan PCRE, Anda dapat melakukan:Sementara
.
cocok dengan karakter,\X
cocok dengan ideogram / graphem.Di lokal UTF-8:
Dalam yang terakhir
études
, ada 7 karakter, 8 byte, dan 6 graphem.sumber
echo épée | grep -Px '\X{6}'
ouputépée
é
atas disandikan dalam UTF-8).Anda dapat mencoba sesuatu seperti:
grep "^[A-Za-z]\{6\}$" myfile.txt
atau jika kata-kata itu mungkin mengandung angka juga, maka:
grep "^[A-Za-z0-9]\{6\}$" myfile.txt
Cukup tambahkan karakter apa saja ke dalam tanda kurung siku yang Anda inginkan sebagai tambahan.
sumber
étude
sama sekali, karena karakter ASCII yang sesuai dengan aksen akan mengacaukan regex.