Alat berfitur untuk mencari dalam file teks terstruktur lekukan.
Terinspirasi oleh ogrep oleh Matt Brubeck. Ogrep itu kompak dan cantik, tapi tidak menonjol.
Lihat juga ogrep — port alat ini ditulis dengan Python (sebenarnya, ini yang pertama).
ogrep
mirip dengan grep
, keduanya dapat mencari kecocokan dan menampilkan konteksnya. Namun konteks dalam grep
adalah “N baris sebelum/sesudah kecocokan”, dan dalam ogrep
adalah “baris di atas cocok dengan satu dengan lekukan lebih rendah”.
Biar saya jelaskan. Saya menggunakan alat ini sebagian besar ketika bekerja dengan file build GN, jadi saya akan menggunakan beberapa file BUILD.gn yang besar sebagai contoh. Tugas yang biasa dilakukan adalah mencari nama file sumber dan memahami target mana yang menyertakan file ini dan dalam kondisi apa.
Mari kita temukan penyebutan file “arena.cc”:
# grep arena.cc BUILD.gn
"base/arena.cc",
Oke, sekarang file kita sudah ada di sini, tetapi tidak tahu targetnya. Mari kita tanyakan beberapa konteksnya:
# grep -C2 arena.cc BUILD.gn
"base/address_tracker_linux.cc",
"base/address_tracker_linux.h",
"base/arena.cc",
"base/arena.h",
"base/backoff_entry.cc",
Tidak, tidak terlalu berguna. Mari kita coba ogrep
:
ogrep arena.cc BUILD.gn
102: component("net") {
385: if (!is_nacl) {
386: sources += [
409: "base/arena.cc",
Nah, itu berguna! Kita segera mengetahui bahwa file tersebut dimasukkan ke dalam target “net” dalam kondisi “!is_nacl”.
Lebih bagus lagi karena ogrep
bisa menggunakan warna, berikut gambarnya:
Instal Rust dan Cargo, jika Anda belum melakukannya
cargo install ogrep
Instal Homebrew, lalu
brew install kriomant/ogrep-rs/ogrep-rs
Maaf, belum, tapi saya sedang mengerjakannya. Gunakan Kargo untuk saat ini.
Ada banyak opsi yang tersedia, jalankan dengan --help
untuk mencantumkannya.
Alat ini berguna tidak hanya untuk file berbasis indentasi ketat (seperti sumber Python) atau file build GN, namun untuk berbagai file teks, karena bahkan file yang tidak berbasis indentasi biasanya diformat untuk kenyamanan.
Bahkan ada beberapa peretasan terkait C yang ada di dalamnya.
Berikut adalah daftar fitur singkat:
Pola adalah teks tetap secara default, tetapi Anda dapat menggunakan ekspresi reguler arbitrer dengan -e
.
Tersedia -w
(mencocokkan seluruh kata) dan -i
(pencarian tidak peka huruf besar/kecil) biasa.
Alat mempertahankan beberapa baris kosong di antara kecocokan, karena membantu memisahkan grup kecocokan terkait secara visual, Anda dapat mematikannya dengan --no-breaks
.
Terkadang berguna untuk melihat apakah ada garis lain di antara garis yang cocok. Gunakan --ellipsis
untuk itu.
Jika Anda mengintegrasikan otool
dengan alat eksternal, opsi --print-filename
mungkin berguna, ia memerintahkan untuk mencetak nama file jika ditemukan kecocokan.
Secara default, cabang “if-else” diperlakukan secara khusus: cabang if dipertahankan sehingga Anda mengetahui kondisi bahkan ketika kecocokan ditemukan di cabang “else”:
Konteks tradisional (menampilkan N garis depan dan/atau akhir di sekitar garis yang cocok) juga didukung dengan opsi --context/-C
, --before-context/-B
dan --after-context/-A
.
# ./ogrep filename_util_icu BUILD.gn
102: component("net") {
2106: if (!is_nacl) {
2210: if (use_platform_icu_alternatives) {
2222: } else {
2228: sources += [
2229: "base/filename_util_icu.cc",
Ini dapat dimatikan dengan --no-smart-branches
.
--no-ignore-preprocessor
diberikan.Penanganan instruksi praprosesor yang lebih cerdas (konteks paralel) direncanakan.
otool
dimaksudkan untuk mencari dalam satu file saja. Dan tidak secepat itu digunakan untuk mencari banyak file. Namun Anda dapat mengintegrasikannya dengan alat pencarian lain seperti ini:
grep -l cache_used -r . --include='*.cc' | xargs -n1 ogrep --print-filename cache_used
git grep
bawaan ogrep
memiliki integrasi bawaan dengan git grep
: ketika opsi -g
diberikan, argumen kedua diteruskan ke git grep
sebagai spesifikasi jalur. Semua opsi yang relevan ( -w
, -i
, dll.) juga diteruskan ke git grep
secara otomatis, --print-filename
dipaksa.
ogrep -g cache_used '*.cc'