Saya sering menggunakan grep untuk menemukan file yang memiliki entri tertentu seperti ini:
grep -R 'MyClassName'
Hal baiknya adalah ia mengembalikan file, isinya, dan menandai string yang ditemukan berwarna merah. Yang buruk adalah bahwa saya juga memiliki file besar di mana seluruh teks ditulis dalam satu baris tunggal besar. Sekarang grep output terlalu banyak ketika menemukan teks di dalam file-file besar itu. Apakah ada cara untuk membatasi output misalnya 5 kata ke kiri dan ke kanan? Atau mungkin membatasi output hingga 30 huruf ke kiri dan ke kanan?
command-line
text-processing
grep
Socrates
sumber
sumber
cut
cut
, karena hanya dibagi oleh pembatas atau dengan jumlah karakter. Padahal ketika saya menemukan garisMyClassName
dengannya mungkin ada di mana saja di baris tersebut dan tidak selalu pada posisi yang sama. Selain itu, mungkin ada variasi karakter di bagian depan dan belakang, yang mematahkan kemungkinan untuk dipisah oleh pembatas.MyClassName
telah ditemukan, saya ingin mendapatkan sebagai hasilnya nama file dan karakter x ke kiri dan ke kanan. x adalah nomor apa pun yang saya berikan, misalnya 30. Sisa dari isi file akan diabaikan. Ini untuk mendapatkan konteks ke file yang cocok dan membatasi kelebihan.cut
jika ada tiga file dengan input berikut:oiadfaosuoianavMyClassNameionaernaldfajd
dan/(/&%%§%/(§(/MyClassName&((/$/$/(§/$&
danpublic class MyClassName { public static void main(String[] args) { } }
?Jawaban:
grep
itu sendiri hanya memiliki opsi untuk konteks berdasarkan garis. Alternatif disarankan oleh posting SU ini :Sebagai alternatif lain, saya menyarankan
fold
teks dan kemudian mengambilnya, misalnya:The
-s
pilihan akan membuatfold
dorongan kata-kata untuk baris berikutnya bukannya melanggar di antara.Atau gunakan cara lain untuk membagi input dalam garis berdasarkan pada struktur input Anda. (Posting SU, misalnya, berurusan dengan JSON, jadi menggunakan
jq
dll untuk mencetak-cantik dangrep
... atau hanya menggunakanjq
untuk melakukan penyaringan dengan sendirinya ... akan lebih baik daripada salah satu dari dua alternatif yang diberikan di atas.)Metode awk GNU ini mungkin lebih cepat:
-v RS=...
), dan jumlah karakter dalam konteks (-v n=...
)FNR > 1
) adalah satu di mana awk menemukan kecocokan untuk pola.n
karakter tambahan dari baris sebelumnya (p
) dann
karakter utama dari baris saat ini (substr($0, 0, n)
), bersama dengan teks yang cocok untuk baris sebelumnya (yaituprt
)p
danprt
setelah mencetak, sehingga nilai yang kami atur digunakan oleh baris berikutnyaRT
adalah GNUism, itu sebabnya ini adalah GNU awk-specific.Untuk pencarian rekursif, mungkin:
sumber
fold
metode dapat digunakan hanya jika Anda yakin bahwa mencari string yang tidak muncul di perbatasan, jika tidak maka akan mendapatkan disembunyikan olehgrep
.gawk
. Sayangnya, perintah yang disarankan denganfind
menampilkan hal-hal acak dan tanpa nama file, ketika dijalankan pada sistem saya. Selain itu, saya tidak cukup fasihawk
untuk menganalisis perintah dengan benar. Saat ini, Regex dalam kombinasi dengangrep
pemecahan masalah mungkin tidak cepat, tetapi dapat diandalkan. Sekali lagi terima kasih banyak.RT
dan awalan, dll. Yang harus digunakan.Menggunakan pencocokan hanya dalam kombinasi dengan beberapa opsi lain (lihat di bawah), mungkin sangat dekat dengan apa yang Anda cari, tanpa memproses overhead regex yang disebutkan dalam jawaban lain
sumber
MyClassName
. Karenanya, konteksnya hilang.grep -RnHo "MyClassName"
dangrep -Rno "MyClassName"
memiliki output yang sama.-o
flag mungkin menarik jika regex memiliki beberapa bagian variabel. Untuk string tetap, percuma untuk mencetaknya setiap kali. OP kemungkinan besar tertarik pada konteks dekat.-B 1
) atau sesudah (-A 1
). Maaf saya tidak bisa membantu.