`grep` untuk menemukan kata dengan beberapa kriteria (untuk scrabble)

0

Saya menggunakan daftar kata-kata scrabble yang saya unduh dengan nama "sowpods.txt" dan saya mencoba menggunakan grepuntuk menemukan semua kata dengan kriteria ini:

  • Kata 7 huruf
  • Mulai dan diakhiri dengan huruf yang sama
  • Memiliki huruf kedua, keempat, dan keenam yang sama
  • Memiliki huruf 3 dan 5 yang berbeda

Garis yang saya miliki sejauh ini

grep -i "^(.).*\1$" sowpods.txt > output.txt

memberi saya kesalahan backreference jadi saya mencoba menggunakan panduan online tetapi mereka sangat membingungkan. Apakah ini mungkin? Jika demikian, bisakah seseorang membantu?

Saya menggunakan Mac dan menggunakan terminal default.

Kappa123
sumber
1
Pertanyaan Anda sebelumnya menunjukkan Anda perlu grep -Eatau untuk keluar dari tanda kurung. Ini harus menghilangkan kesalahan backreference, Anda akan dapat melanjutkan sekarang. Mengapa Anda bertanya tentang (sebagian) masalah yang sama? Apakah solusi untuk pertanyaan lain tidak berfungsi di Mac? Jika tidak, hal yang benar untuk dilakukan adalah memberikan umpan balik kepada pengguna yang mencoba membantu Anda di sana dan menyelesaikan pertanyaan lainnya terlebih dahulu, alih-alih mengemukakan masalah yang sama untuk kedua kalinya.
Kamil Maciorowski
Ah, saya tidak mengerti bahwa E adalah masalahnya, saya hanya memasukkan kalimat yang mereka berikan kepada saya. Meskipun saya sebenarnya tidak tahu harus ke mana dari baris kode yang saya miliki sekarang :(.
Kappa123
1
Baiklah kalau begitu. Jika pertanyaan lain terpecahkan maka harap terima salah satu jawaban di sana (ikuti tur kami untuk mengetahui cara kerjanya). Anda juga harus mengedit pertanyaan saat ini sehingga tidak menyebutkan "kesalahan referensi-balik", karena Anda tahu cara mengatasinya dan itu bukan lagi masalah (atau bagian dari masalah); berkonsentrasi pada apa pun masalah sebenarnya sekarang . Jika "kesalahan referensi-ulang" adalah satu - satunya masalah Anda, maka pertanyaan ini harus dihapus atau setidaknya ditutup sebagai duplikat dari yang lain.
Kamil Maciorowski
Bisakah huruf kedua sama dengan huruf pertama? Bisakah yang ketiga sama dengan yang kedua? ... Tolong, edit pertanyaan Anda dan tambahkan kasus uji.
Toto

Jawaban:

1

Menggunakan -Popsi (PCRE) jika tersedia di sistem Anda:

grep -P '^(?=[a-zA-Z]{7}$)(.)(?!\1)(.)(?!\1)(?!\2)(.)\2(?!\1)(?!\2)(?!\3).\2\1$' inputfile

Penjelasan:

^
  (?=[a-zA-Z]{7}$)  : positive lookahead, zero-length assertion that make sure we have exactly 7 letters. You may use \pL{7} if you want to deal with any laguage
  (.)               : first letter, captured in group 1
  (?!\1)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 1 after
  (.)               : second letter, captured in group 2
  (?!\1)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 1 after
  (?!\2)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 2 after
  (.)               : third letter, captured in group 3
  \2                : fourth letter == second letter
  (?!\1)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 1 after
  (?!\2)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 2 after
  (?!\3)            : negative lookahead, zero-length assertion that make sure we don't have the same letter as in group 3 after
  .                 : fifth letter
  \2                : sixth letter == second letter
  \1                : seventh letter == first letter
$

DEMO

Toto
sumber