들여쓰기 구조의 텍스트 파일을 검색하는 데 유용한 도구입니다.
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",
이제 유용합니다! 우리는 해당 파일이 "!is_nacl" 조건 하에 "net" 대상에 포함되어 있음을 즉시 알 수 있습니다.
ogrep
색상을 사용할 수 있기 때문에 더 좋습니다. 그림은 다음과 같습니다.
Rust와 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" 분기에서 일치 항목이 발견되더라도 조건을 알 수 있습니다.
--context/-C
, --before-context/-B
및 --after-context/-A
옵션을 사용하면 기존 컨텍스트(일치하는 항목 주위에 N 선행 및/또는 후행 줄 표시)도 지원됩니다.
# ./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'