Saya mencoba mencari substring "abc" di file tertentu di linux / bash
Jadi saya melakukan:
grep '*abc*' myFile
Itu tidak mengembalikan apa-apa.
Tetapi jika saya melakukannya:
grep 'abc' myFile
Ini mengembalikan pertandingan dengan benar.
Sekarang, ini bukan masalah bagi saya. Tetapi bagaimana jika saya ingin grep untuk string yang lebih kompleks, katakanlah
*abc * def *
Bagaimana cara melakukannya dengan grep?
*
berarti hal yang sama dalam grep dan egrep: ini adalah pembilang yang berarti nol atau lebih dari atom sebelumnya. Itu adalah konsep yang sama sekali berbeda dari karakter pengganti yang digunakan oleh shell.Jawaban:
Tanda bintang hanyalah operator pengulangan , tetapi Anda perlu memberi tahu apa yang Anda ulangi.
/*abc*/
cocok dengan string yang berisi ab dan nol atau lebih c (karena * kedua ada di c; yang pertama tidak ada artinya karena tidak ada yang diulangi). Jika Anda ingin mencocokkan apa pun, Anda perlu mengatakan.*
- titik berarti karakter apa pun ( dalam pedoman tertentu ). Kalau mau cocok aja abc, tinggal bilang ajagrep 'abc' myFile
. Untuk kecocokan yang lebih kompleks, Anda perlu menggunakan.*
-grep 'abc.*def' myFile
akan mencocokkan string yang berisi abc diikuti def dengan sesuatu opsional di antaranya.Pembaruan berdasarkan komentar:
*
dalam ekspresi reguler tidak persis sama dengan * di konsol. Di konsol, * adalah bagian dari a konstruksi glob , dan hanya bertindak sebagai karakter pengganti (misalnyals *.log
akan mencantumkan semua file yang diakhiri dengan .log). Namun, dalam ekspresi reguler, * adalah pengubah, artinya ini hanya berlaku untuk karakter atau grup yang mendahuluinya. Jika Anda ingin * dalam ekspresi reguler berfungsi sebagai karakter pengganti, Anda perlu menggunakan.*
seperti yang disebutkan sebelumnya - titik adalah karakter karakter pengganti, dan bintang, saat mengubah titik, berarti menemukan satu atau beberapa titik; yaitu. temukan satu atau lebih karakter apa pun.sumber
*
berarti "0 atau lebih", dan grep secara default adalah serakah. Perhatikan bahwa dalam grep dasar ekspresi reguler yang metakarakter?
,+
,{
,|
,(
, dan)
kehilangan makna khusus mereka. Info lebih lanjut: grep regexpsKarakter titik berarti cocok dengan karakter apa pun, jadi
.*
berarti nol atau lebih kemunculan karakter apa pun. Anda mungkin bermaksud menggunakan,.*
bukan hanya*
.sumber
"Tanda bintang" hanya bermakna jika ada sesuatu di depannya. Jika tidak ada alat (grep dalam kasus ini) mungkin akan memperlakukannya sebagai kesalahan. Sebagai contoh:
'*xyz' is meaningless 'a*xyz' means zero or more occurrences of 'a' followed by xyz
sumber
Gunakan grep -P - yang mengaktifkan dukungan untuk ekspresi reguler gaya Perl.
grep -P "abc.*def" myfile
sumber
Ekspresi yang Anda coba, seperti yang bekerja pada baris perintah shell di Linux misalnya, disebut " glob ". Ekspresi Glob bukanlah ekspresi reguler penuh , yang digunakan grep untuk menentukan string yang dicari. Berikut adalah postingan (lama, kecil) tentang perbedaannya. Ekspresi glob (seperti dalam "ls *") diinterpretasikan oleh shell itu sendiri.
Mungkin saja untuk menerjemahkan dari globs ke RE, tetapi Anda biasanya perlu melakukannya di kepala Anda.
sumber
Anda tidak menggunakan ekspresi reguler, jadi varian grep pilihan Anda haruslah
fgrep
, yang akan berperilaku seperti yang Anda harapkan.sumber
fgrep
sekarang tidak digunakan lagi,grep -f
sebaiknya digunakan sebagai gantinya.Coba grep -E untuk dukungan ekspresi reguler yang diperluas
Lihat juga:
Halaman manual grep
sumber
Ini mungkin jawaban yang Anda cari:
Hanya masalahnya ... itu akan mengeluarkan baris "def" sebelum ATAU setelah "abc"
sumber
Ini berhasil untuk saya:
grep ". * $ {expr}" - dengan tanda kutip ganda, diawali dengan titik. Di mana "expr" adalah string apa pun yang Anda butuhkan di akhir baris.
Unix grep standar tanpa sakelar tambahan.
sumber
'*' berfungsi sebagai pengubah untuk item sebelumnya. Jadi 'abc * def' mencari 'ab' diikuti oleh 0 atau lebih 'c's diikuti dengan' def '.
Yang mungkin Anda inginkan adalah 'abc. * Def' yang mencari 'abc' diikuti dengan sejumlah karakter, diikuti dengan 'def'.
sumber