Apakah ada cara untuk membuat "kata" grep output dari file yang cocok dengan ekspresi pencarian?
Jika saya ingin menemukan semua contoh, katakanlah, "th" di sejumlah file, saya dapat melakukan:
grep "th" *
tetapi hasilnya akan seperti (berani adalah saya);
beberapa teks-berkas: the cat duduk di dalam tikar beberapa-lain-text file: yang cepat rubah cokelat yet-another-text-file: saya harap ini menjelaskannya secara menyeluruh
Apa yang ingin saya hasilkan, menggunakan pencarian yang sama, adalah:
the
the
the
this
thoroughly
Apakah ini mungkin menggunakan grep? Atau menggunakan kombinasi alat lainnya?
Jawaban:
Coba grep -o
Sunting: cocok dengan komentar Phil
Dari dokumen :
sumber
"\w*th\w*" *
artinya, jadi saya pikir saya akan memposting.\w
adalah [_ [: alnum:]], jadi ini pada dasarnya cocok dengan "kata" apa pun yang berisi 'th' (karena\w
tidak termasuk spasi). Bagian * setelah kutipan adalah gumpalan untuk file mana (yaitu, mencocokkan semua file dalam direktori ini)\w
umumnya tidak portabel untukgrep -E
; untuk portabilitas yang tepat, gunakan nama kelas karakter POSIX[[:alnum:]]
saja (atau[_[:alnum:]]
jika Anda benar-benar menginginkan garis bawah juga; atau cobagrep -P
jika platform Anda memilikinya).-h
sepenuhnya perlu saya katakan ..?Jawaban aman distribusi silang (termasuk windows minGW?)
Jika Anda menggunakan versi grep yang lebih lama (seperti 2.4.2) yang tidak termasuk opsi -o. Gunakan yang di atas. Lain gunakan yang lebih sederhana untuk mempertahankan versi di bawah ini.
Linux cross distribution jawaban aman
Untuk merangkum
-oh
output ekspresi reguler cocok dengan konten file (dan bukan nama file), sama seperti bagaimana Anda mengharapkan ekspresi reguler bekerja di vim / etc ... Apa kata atau ekspresi reguler yang akan Anda cari, terserah kamu! Selama Anda tetap ke POSIX dan bukan sintaks perl (lihat di bawah)Lebih banyak dari manual untuk grep
Alasan mengapa jawaban awal tidak bekerja untuk semua orang
Penggunaan
\w
bervariasi dari platform ke platform, sebagai sintaks "perl" yang diperpanjang. Dengan demikian, instalasi grep yang terbatas untuk bekerja dengan kelas karakter POSIX menggunakan[[:alpha:]]
dan tidak setara dengan perl\w
. Lihat halaman Wikipedia pada ekspresi reguler untuk lebih lanjutPada akhirnya, jawaban POSIX di atas akan jauh lebih dapat diandalkan terlepas dari platform (menjadi yang asli) untuk grep
Sedangkan untuk dukungan grep tanpa opsi -o, grep pertama menampilkan garis yang relevan, tr membagi spasi ke baris baru, filter grep akhir hanya untuk masing-masing baris.
(PS: Saya tahu sebagian besar platform sekarang, pasti telah ditambal untuk \ w .... tetapi selalu ada yang tertinggal)
Penghargaan untuk solusi "-o" dari jawaban @AdamRosenfield
sumber
-o
Opsi ini tidak ada di grep windows yang menginstal dengan paket git (minGW?):"c:\Program Files (x86)\Git\bin\grep" --version grep (GNU grep) 2.4.2
Ini lebih sederhana dari yang Anda pikirkan. Coba ini:
Dimana,
sumber
Anda bisa menerjemahkan spasi ke baris baru dan kemudian menangkap, misalnya:
sumber
tr
, ia bisa melakukannyagrep
terlebih dahulu, jaditr
akan diterapkan hanya pada baris yang cocok:grep th filename | tr ' ' '\n' | grep th
Hanya
awk
, tidak perlu kombinasi alat.sumber
perintah grep hanya untuk pencocokan dan perl
sumber
th
karena Anda meminta pengulangan sesingkat mungkin dari wildcard.Saya tidak puas dengan sintaks awk yang sulit diingat tetapi saya menyukai gagasan menggunakan satu utilitas untuk melakukan ini.
Sepertinya ack (atau ack-grep jika Anda menggunakan Ubuntu) dapat melakukan ini dengan mudah:
Jika Anda menghilangkan flag -h yang Anda dapatkan:
Sebagai bonus, Anda dapat menggunakan
--output
flag untuk melakukan ini untuk pencarian yang lebih kompleks dengan sintaks termudah yang saya temukan:sumber
sumber
cat
?Untuk mencari semua kata dengan mulai dengan "ikon-" perintah berikut ini berfungsi dengan sempurna. Saya menggunakan Ack di sini yang mirip dengan grep tetapi dengan opsi yang lebih baik dan format yang bagus.
sumber
Anda juga dapat mencoba pcregrep . Ada juga
-w
opsi dalam grep , tetapi dalam beberapa kasus tidak berfungsi seperti yang diharapkan.Dari Wikipedia :
sumber
Saya punya masalah yang sama, mencari grep / pola regex dan "pola cocok ditemukan" sebagai keluaran.
Pada akhirnya saya menggunakan egrep (regex yang sama pada grep -e atau -G tidak memberi saya hasil yang sama dari egrep) dengan opsi -o
jadi, saya pikir itu bisa menjadi sesuatu yang mirip (Saya BUKAN regex Master):
sumber
{1}
Pengukur yang tidak berguna harus dijatuhkan. Atau jika Anda ingin konsisten,t{1}h{1}e{1}
dll.Anda bisa menyalurkan output grep Anda ke Perl seperti ini:
sumber
Kutipan dari halaman manual grep:
-w: Pilih hanya baris yang berisi kecocokan yang membentuk seluruh kata. Pengujiannya adalah bahwa substring yang cocok harus berada di awal baris, atau didahului oleh karakter konstituen non-kata.
sumber
the
tidak lagi cocok misalnya "ini" atau "mandi".ripgrep
Berikut ini contoh penggunaannya
ripgrep
:Ini akan cocok dengan semua kata yang cocok
th
.sumber