Saya sudah mencoba menemukan cara untuk menyaring garis yang memiliki kata "lemon" dan "nasi" di dalamnya. Saya tahu cara menemukan "lemon" atau "nasi" tetapi tidak keduanya. Mereka tidak perlu berada di sebelah yang lain, hanya satu baris teks yang sama.
text-processing
grep
Sebastian
sumber
sumber
Jawaban:
"Keduanya pada baris yang sama" berarti "'nasi' diikuti oleh karakter acak diikuti oleh 'lemon' atau sebaliknya".
Di regex itu adalah
rice.*lemon
ataulemon.*rice
. Anda dapat menggabungkannya menggunakan|
:Jika Anda ingin menggunakan regex normal alih-alih yang diperluas (
-E
) Anda perlu garis miring terbalik sebelum|
:Untuk lebih banyak kata yang dengan cepat menjadi agak panjang dan biasanya lebih mudah untuk menggunakan beberapa panggilan
grep
, misalnya:sumber
grep rice
baris-baris yang ditemukan mengandungrice
. Ini dimasukkan ke dalamgrep lemon
yang hanya akan menemukan garis-garis yang mengandung lemon .. dan seterusnya. Sedangkan OP - serta jawaban Anda sebelumnya - memungkinkan salah satu [nasi | lemon | ayam]|
perlu melarikan dirigrep
? Terima kasih!egrep
menggunakan regex diperpanjang di mana|
dipahami sebagai logika OR.grep
default ke regex dasar, di mana\|
ORgrep
halaman manual,egrep
sudah usang dan harus diganti olehgrep -E
. Saya mengambil kebebasan untuk mengedit jawaban sesuai.Anda dapat menyalurkan output dari perintah grep pertama ke perintah grep lain dan itu akan cocok dengan kedua pola. Jadi, Anda dapat melakukan sesuatu seperti:
atau,
Contoh:
Mari kita tambahkan beberapa konten ke file kita:
Apa isi file:
Sekarang, mari kita ambil apa yang kita inginkan:
Kami hanya mendapatkan garis di mana kedua pola cocok. Anda dapat memperpanjang ini dan menyalurkan output ke perintah grep lain untuk kecocokan "DAN" lebih lanjut.
sumber
Meskipun pertanyaannya menanyakan 'grep', saya pikir mungkin bermanfaat untuk mengirim solusi 'awk' sederhana:
Ini dapat dengan mudah diperpanjang dengan lebih banyak kata, atau ekspresi boolean lain selain 'dan'.
sumber
Gagasan lain untuk menemukan kecocokan dalam urutan apa pun adalah menggunakan:
grep dengan opsi
-P
(Perl-Kompatibilitas) dan regex lookahead positif(?=(regex))
:atau Anda dapat menggunakan di bawah ini, sebagai gantinya:
.*?
cara pencocokan karakter apapun.
yang kejadian nol atau lebih kali*
saat mereka berada opsional diikuti oleh pola (rice
ataulemon
). The?
membuat segalanya opsional sebelum (berarti nol atau satu waktu dari segala sesuatu cocok.*
)(?=pattern)
: Positif Lookahead: Konstruk lookahead positif adalah sepasang tanda kurung, dengan tanda kurung buka diikuti oleh tanda tanya dan tanda sama dengan.Jadi ini akan mengembalikan semua baris dengan berisi keduanya
lemon
danrice
dalam urutan acak. Ini juga akan menghindari penggunaan|
s dan doubledgrep
s.Tautan eksternal: Topik Grep Tingkat Lanjut Cari Positif - GREP untuk Desainer
sumber
Akan mengembalikan kecocokan untuk foo atau goo
sumber
Jika kita mengakui bahwa memberikan jawaban yang tidak
grep
didasarkan adalah dapat diterima, seperti jawaban di atas berdasarkanawk
, saya akan mengusulkanperl
garis sederhana seperti:Pencarian dapat mengabaikan kasus dengan beberapa / semua kata seperti
/lemon/i and /rice/i
. Pada sebagian besar mesin Unix / Linux perl diinstal juga sebagai awk.sumber
Berikut ini skrip untuk mengotomatiskan solusi grep piping:
sumber
eval
membuatnya, yang mudah rusak