เครื่องมือที่โดดเด่นสำหรับการค้นหาในไฟล์ข้อความที่มีโครงสร้างการเยื้อง
แรงบันดาลใจจากอสูรโดย Matt Brubeck ogrep นั้นกะทัดรัดและสวยงาม แต่ไม่มีคุณลักษณะ
ดูเพิ่มเติมที่ ogrep - พอร์ตของเครื่องมือนี้เขียนด้วย Python (จริงๆ แล้วเป็นพอร์ตแรก)
ogrep
ก็เหมือนกับ grep
มาก โดยทั้งคู่สามารถค้นหารายการที่ตรงกันและแสดงบริบทได้ แต่บริบทใน grep
คือ “N บรรทัดก่อน/หลังการแข่งขัน” และใน ogrep
มันคือ “บรรทัดที่อยู่เหนือบรรทัดที่ตรงกันซึ่งมีการเยื้องที่ต่ำกว่า”
ให้ฉันอธิบาย. ฉันใช้เครื่องมือนี้เป็นส่วนใหญ่เมื่อทำงานกับไฟล์บิลด์ GN ดังนั้นฉันจะใช้ไฟล์ BUILD.gn ขนาดใหญ่บางไฟล์เป็นตัวอย่าง งานปกติคือการค้นหาชื่อไฟล์ต้นฉบับและทำความเข้าใจว่าเป้าหมายใดรวมไฟล์นี้และภายใต้เงื่อนไขใด
มาดูการกล่าวถึงไฟล์ “arena.cc” กัน:
# grep arena.cc BUILD.gn
"base/arena.cc",
ตกลง ตอนนี้เรามาถึงไฟล์ของเราแล้ว แต่ไม่ทราบเป้าหมาย ลองถามบริบทบางอย่าง:
# 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",
ไม่ ไม่มีประโยชน์ขนาดนั้น มาลอง ogrep
:
ogrep arena.cc BUILD.gn
102: component("net") {
385: if (!is_nacl) {
386: sources += [
409: "base/arena.cc",
ตอนนี้มีประโยชน์แล้ว! เรารู้ทันทีว่าไฟล์นั้นรวมอยู่ในเป้าหมาย "net" ภายใต้เงื่อนไข "!is_nacl"
จะดีกว่านี้อีก เนื่องจาก ogrep
สามารถใช้สีได้ นี่คือรูปภาพ:
ติดตั้ง Rust and Cargo หากคุณยังไม่ได้ติดตั้ง
cargo install ogrep
ติดตั้ง Homebrew จากนั้น
brew install kriomant/ogrep-rs/ogrep-rs
ขออภัย ยังไม่มี แต่ฉันกำลังดำเนินการอยู่ ใช้ Cargo ในตอนนี้
มีตัวเลือกมากมายให้รันด้วย --help
เพื่อแสดงรายการเหล่านั้น
เครื่องมือนี้มีประโยชน์ไม่เพียงแต่สำหรับไฟล์ที่มีการเยื้องที่เข้มงวด (เช่น แหล่งที่มาของ Python) หรือไฟล์บิลด์ GN เท่านั้น แต่ยังมีประโยชน์สำหรับไฟล์ข้อความที่หลากหลาย เนื่องจากแม้แต่ไฟล์ที่ไม่มีการเยื้องก็มักจะได้รับการจัดรูปแบบเพื่อความสะดวก
มีแฮ็กที่เกี่ยวข้องกับ C บางตัวในตัวด้วย
นี่คือรายการคุณสมบัติโดยย่อ:
รูปแบบเป็นข้อความคงที่ตามค่าเริ่มต้น แต่คุณสามารถใช้นิพจน์ทั่วไปกับ -e
ได้ตามใจชอบ
ปกติแล้ว -w
(จับคู่ทั้งคำ) และ -i
(การค้นหาแบบคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่)
เครื่องมือจะเก็บบรรทัดว่างไว้ระหว่างการจับคู่ เนื่องจากจะช่วยแยกกลุ่มของการจับคู่ที่เกี่ยวข้องด้วยสายตา คุณสามารถปิดได้ด้วย --no-breaks
บางครั้งการดูว่ามีเส้นอื่นระหว่างเส้นที่ตรงกันหรือไม่ก็มีประโยชน์ ใช้ --ellipsis
สำหรับสิ่งนั้น
หากคุณรวม otool
เข้ากับเครื่องมือภายนอก ตัวเลือก --print-filename
อาจมีประโยชน์ โดยจะแจ้งให้พิมพ์ชื่อไฟล์หากพบการจับคู่ใดๆ
ตามค่าเริ่มต้นสาขา “if-else” จะได้รับการปฏิบัติเป็นพิเศษ: สาขา if-else จะถูกเก็บรักษาไว้ เพื่อให้คุณทราบเงื่อนไขแม้ว่าจะพบการจับคู่ในสาขา “else”:
บริบทแบบดั้งเดิม (การแสดง N นำหน้าและ/หรือต่อท้ายรอบรายการที่ตรงกัน) ยังรองรับ --context/-C
, --before-context/-B
และ --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",
--no-smart-branches
สามารถปิดได้ด้วย
--no-ignore-preprocessor
มีการวางแผนการจัดการคำสั่งพรีโปรเซสเซอร์อย่างชาญฉลาดยิ่งขึ้น (บริบทคู่ขนาน)
otool
มีวัตถุประสงค์เพื่อค้นหาในไฟล์เดียวเท่านั้น และไม่เร็วนักที่จะใช้ค้นหาไฟล์หลายๆ ไฟล์ แต่คุณสามารถรวมเข้ากับเครื่องมือค้นหาอื่น ๆ เช่นนี้:
grep -l cache_used -r . --include='*.cc' | xargs -n1 ogrep --print-filename cache_used
git grep
ในตัว ogrep
มีการรวมเข้ากับ git grep
ในตัว : เมื่อกำหนดตัวเลือก -g
อาร์กิวเมนต์ที่สองจะถูกส่งผ่านไปยัง git grep
เป็นข้อกำหนดเส้นทาง ตัวเลือกที่เกี่ยวข้องทั้งหมด ( -w
, -i
ฯลฯ ) จะถูกส่งผ่านไปยัง git grep
โดยอัตโนมัติ --print-filename
ถูกบังคับ
ogrep -g cache_used '*.cc'