GNU/Linux >> Belajar Linux >  >> Linux

Ekspresi Reguler untuk menemukan karakter ganda di Bash

Ini benar-benar dua pertanyaan, dan seharusnya dipisahkan. Tapi karena jawabannya relatif sederhana, saya akan taruh di sini. Jawaban ini untuk GNU grep khusus.

a) egrep sama dengan grep -E . Keduanya menunjukkan bahwa "Extended Regular Expressions" harus digunakan sebagai pengganti grep Ekspresi Reguler bawaan. grep membutuhkan garis miring terbalik untuk Regular Expressions biasa.

Dari man halaman:

Ekspresi Reguler Dasar vs Diperpanjang

Dalam ekspresi reguler dasar, karakter meta ? , + , { , | , ( , dan ) kehilangan arti khusus mereka; alih-alih gunakan versi garis miring terbalik \? , \+ , \{ , \| , \( , dan \) .

Lihat man halaman untuk detail tambahan tentang konvensi historis dan portabilitas.

b) Gunakan egrep '(.)\1{N}' dan ganti N dengan jumlah karakter yang ingin Anda ganti minus satu (karena titik cocok dengan yang pertama). Jadi jika Anda ingin mencocokkan karakter yang diulang sebanyak empat kali, gunakan egrep '(.)\1{3}' .


Ini akan mencari 2 kejadian atau lebih dari karakter yang sama:

grep -E '(.)\1+' file

Jika awk Anda memiliki opsi -o, ini akan mencetaknya setiap kecocokan pada baris baru..

grep -Eo '(.)\1+' file

Untuk menemukan kecocokan dengan tepat 3 kecocokan:

grep -E '(.)\1{2}' file

Atau 3 atau lebih:

grep -E '(.)\1{2,}' file

dll..

edit

Sebenarnya @stephane_chazelas benar tentang referensi belakang dan -E. Saya sudah lupa tentang itu. Saya mencobanya di BSD grep dan GNU grep dan berfungsi di sana tetapi tidak di beberapa grep lainnya. Anda harus menggunakan salah satu versi di bawah ini..

Versi grep reguler:

grep '\(.\)\1\{1,\}' file

grep -o '\(.\)\1\{1,\}' file

grep '\(.\)\1\{2\}' file

grep '\(.\)\1\{2,\}' file

-o opsi juga bukan standar grep BTW (mungkin jika grep Anda mengerti -o itu juga bisa melakukan referensi kembali)..

Catatan :grep -E '(.)\1{2,}' file dan grep '\(.\)\1\{2\}' file salah seperti yang ditunjukkan alexis dan harus diabaikan..


Pertama, terima kasih atas komentar dan saran dukungan Anda. Ternyata saya sudah cukup dekat dengan jawabannya.

Masalah Utama adalah tentang:

Apakah ada cara sederhana untuk mencari n kejadian dengan karakter yang sama, mis. aa , tttttt

Jawaban singkat :

Perintah [variasi] berikut akan mengulang a setidaknya satu kali dan tidak terbatas

grep 'a\{1,}

grep -E \(a\)\{1,\}

egrep a{1,}

atau, dengan GNU Regular Expressions tersediagrep a\+


Jumlah pengulangan diatur di dalam kurung kurawal, melalui pola {min,max}{n} ulangi tepat n kali, {n,} ulangi setidaknya n kali dan {n,m} ulangi setidaknya n tetapi paling banyak m kali.

Dengan demikian, sebagai konsekuensinya, mengangkat masalah sekunder :

Apakah perlunya menetapkan serangan balik terikat pada perintah yang saya gunakan?

Jawaban singkat :Ya, penggunaan garis miring terbalik tergantung pada apakah seseorang menggunakan grep atau egrep

  • grep :garis miring terbalik mengaktifkan metakarakter [menggunakan Ekspresi Reguler Dasar]
  • egrep garis miring terbalik de -mengaktifkan metakarakter [menggunakan Extended Regular Expressions]

Karena ini adalah jawaban singkatnya, saya ingin memberikan kepada mereka yang mengalami masalah serupa, saya menambahkan ringkasan dasar saya tentang apa yang tampaknya harus diperhatikan, bekerja dengan grep dan egrep .



Ekspresi Reguler Dasar, Diperluas, dan GNU

Ekspresi Reguler Dasar

Digunakan di grep , ed dan sed perintah

Fitur kumpulan Ekspresi Reguler Dasar adalah:

  • Kebanyakan Karakter Meta, mis. ? [ . \ ) dll. diaktifkan melalui garis miring terbalik. Jika tidak ada garis miring terbalik, kata tersebut akan diambil sebagai (bagian dari) istilah penelusuran.
  • ^ $ \< dan \> didukung tanpa garis miring terbalik
  • Tidak ada karakter steno [\b , \s , dll.]

GNU Ekspresi Reguler Dasar ditambahkan ke ini

  • \? ulangi karakter nol atau satu kali (c\? cocok dengan c dan cc ) dan merupakan alternatif untuk \{0,1\}
  • \+ ulangi karakter setidaknya satu kali (c\+ cocok dengan cc , cccccccc dll.) dan merupakan alternatif untuk \{1,\}

  • \| didukung (mis. grep a\|b akan mencari a atau b

grep -E mengaktifkan perintah untuk menggunakan seluruh rangkaian Extended Regular Expressions:


Extended Regular Expressions [ERE]

Digunakan di egrep , awk dan emacs adalah Set Dasar plus beberapa fitur.

  • Metakarakter dinonaktifkan melalui garis miring terbalik
  • Tidak ada referensi balik
  • else:banyak hal ajaib yang biasanya dapat dilakukan oleh Regular Expression

GNU Perluas Ekspresi Reguler

menambahkan fitur berikut

  • kelas steno
  • bilangan

Kedua tautan tersebut akan mengarahkan satu ke ekspresi-reguler.info yang, selain dukungan luar biasa yang saya dapatkan di sini, sangat membantu saya.


Linux
  1. Tr Analog Untuk Karakter Unicode?

  2. Bash:Ekspresi Reguler Dalam Substitusi?

  3. Cara membalikkan ekspresi grep

  1. Menggunakan Bash untuk otomatisasi

  2. Definisi Ekspresi Reguler?

  3. rentang nomor ekstrak grep

  1. Bash + Verifikasi Nama Dengan Ekspresi Reguler?

  2. dasar-dasar grep

  3. 6 Contoh Ekspresi Kondisional Bash ( -e, -eq, -z, !=, [, [[ ..)