grep -Eow '\w{10}' | grep -v '\(.\).*\1'
tidak termasuk kata yang memiliki dua karakter identik.
grep -Eow '\w{10}' | grep -v '\(.\)\1'
mengecualikan yang memiliki karakter berulang.
POSIXly:
tr -cs '[:alnum:]_' '[\n*]' |
grep -xE '.{10}' |
grep -v '\(.\).*\1'
tr
menempatkan kata-kata pada baris mereka sendiri dengan mengonversi setiap spersamaan karakter non-kata ( cpelengkap alfa-numerik dan garis bawah) ke karakter baris baru.
Atau dengan satu grep
:
tr -cs '[:alnum:]_' '[\n*]' |
grep -ve '^.\{0,9\}$' -e '.\{11\}' -e '\(.\).*\1'
(kecualikan garis kurang dari 10 dan lebih dari 10 karakter dan yang memiliki karakter muncul setidaknya dua kali).
Hanya dengan satu grep
(GNU grep dengan dukungan PCRE atau pcregrep
):
grep -Po '\b(?:(\w)(?!\w*\1)){10}\b'
Yaitu, batas kata ( \b
) diikuti oleh urutan 10 karakter kata (asalkan masing-masing tidak diikuti oleh urutan karakter kata dan diri mereka sendiri, menggunakan operator PCRE pandangan ke depan negatif (?!...)
).
Kami beruntung bekerja di sini, karena tidak banyak mesin regexp bekerja dengan referensi balik di dalam bagian berulang.
Perhatikan bahwa (setidaknya dengan versi GNU grep saya)
grep -Pow '(?:(\w)(?!\w*\1)){10}'
Tidak berhasil, tapi
grep -Pow '(?:(\w)(?!\w*\2)){10}'
tidak (as echo aa | grep -Pw '(.)\2'
) yang terdengar seperti bug.
Anda mungkin ingin:
grep -Po '(*UCP)\b(?:(\w)(?!\w*\1)){10}\b'
jika Anda ingin \w
atau \b
mempertimbangkan huruf apa pun sebagai komponen kata dan bukan hanya huruf ASCII di lokal non-ASCII.
Alternatif lain:
grep -Po '\b(?!\w*(\w)\w*\1)\w{10}\b'
Itu adalah batas kata (yang tidak diikuti oleh urutan karakter kata yang berulang) diikuti oleh 10 karakter kata.
Hal-hal yang mungkin ada di benak seseorang:
- Perbandingan adalah case sensitive, jadi
Babylonish
misalnya akan dicocokkan, karena semua karakter berbeda walaupun ada dua B
s, satu huruf kecil dan satu huruf besar (gunakan -i
untuk mengubah itu).
- untuk
-w
, \w
dan \b
, kata adalah huruf (yang ASCII hanya untuk GNU grep
untuk saat ini , [:alpha:]
kelas karakter di lokal Anda jika menggunakan -P
dan (*UCP)
), angka desimal atau garis bawah .
- itu berarti bahwa
c'est
(dua kata berdasarkan definisi kata dalam bahasa Prancis) atau it's
(satu kata berdasarkan definisi kata dalam bahasa Inggris) atau (satu kata sesuai definisi rendez-vous
kata dalam bahasa Prancis) tidak dianggap sebagai satu kata.
- Bahkan dengan
(*UCP)
, Unicode menggabungkan karakter tidak dianggap sebagai komponen kata, jadi téléphone
( $'t\u00e9le\u0301phone'
) dianggap sebagai 10 karakter, salah satunya non-alpha. défavorisé
( $'d\u00e9favorise\u0301'
) akan dicocokkan meskipun punya dua é
karena itu semua 10 karakter alfa yang berbeda diikuti oleh aksen akut kombinasi (non-alfa, jadi ada batas kata antara e
dan aksennya).