AND 패턴을 통해 파일 내용을 재귀적으로 검색하고 ag/silver searcher와 같은 출력을 인쇄하는 방법은 무엇입니까?

AND 패턴을 통해 파일 내용을 재귀적으로 검색하고 ag/silver searcher와 같은 출력을 인쇄하는 방법은 무엇입니까?

이는 예를 들어 설명하는 것이 더 쉬울 것입니다. 이것은 내 입력 파일입니다.

file1:
x
x
a
b
c
x
x

file2:
x
x
c
b
a
x
x

file3:
x
x
x x a b c x x
x
x

file4:
x
x
x x c b a x x
x
x

file5:
x
x
a b
x
x

file6:
x
x
x x b c x x
x
x

file7:
x
x
x x b b x x
x
x

aregexp AND 를 사용하여 파일을 검색하고 싶습니다 c. 그러면 파일 1-4가 반환됩니다.

ag -C <number> --pager="less -R" regexp출력이 출력 에 최대한 가깝게 보이도록 하고 싶습니다 . 다음은 다음과 같습니다(색상 강조 표시를 위해 결과를 꺾쇠 괄호로 묶었습니다).

file1:
2: x
3: <a>
4: b
5: <c>
6: x

file2:
2: x
3: <c>
4: b
5: <a>
6: x

file3:
2: x
3: x x <a> b <c> x x
4: x

file4:
2: x
3: x x <c> b <a> x x
4: x

아니면 ag다음과 같이 인쇄할 수도 있습니다.

file1:
2: x
3: <a>
4: b
--
4: b
5: <c>
6: x

확실하지는 않지만 그 세부 사항은 나에게 중요하지 않습니다. 이것이 하는 일:

  1. 가장 밝은 부분
  2. 위 파일의 상대 경로
  3. 이러한 기능은 less탐색 및 검색을 제공합니다.
  4. 여러 정규 표현식을 찾을 수 있으며 함께 찾을 수도 있습니다.
  5. 옵션 -C이 여전히 명령줄에 존재합니다.

줄 번호는 좋지만 필수는 아닙니다.


나는 많은 것을 시도했고 이것이 내가 얻은 가장 가까운 것입니다:

1단계: 각 정규식에 대한 파일 목록을 미리 컴파일합니다.

for x in $array_of_regexp_file_names; 
  do r=${x/.txt/} ; # remove .txt from the end
  ag -il $r | sort > $x & ; # sort the list of FILES with this single regexp
done

이는 파일 이름별로 정렬된 각 정규식에 대한 파일 목록을 제공합니다.

2단계: ag를 사용하여 2개 이상의 파일 목록이 교차하는 부분 검색

아래에서 분해하겠습니다.

ag -C 1 --pager="less -R" "regexp1|regexp2" $(comm -12 regexp1.txt regexp2.txt)

$(comm -12 regexp1.txt regexp2.txt)

이 명령은 다음을 찾습니다.교차로두 개의 파일 목록. 이 사진의 빨간색은 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

ag -C 1 --pager="less -R" "regexp1|regexp2" ...

ag여기에 정규 표현식을 제공했습니다.알다해당 교차점의 모든 파일에 존재합니다. 중복된 것처럼 보일 수도 있지만 출력에서 ​​단어가 강조 표시되기를 원하기 때문에 이렇게 합니다. 그것은 내 삶을 1000배 더 쉽게 만듭니다.

문제는 교차점에 많은 파일이 있고 명령을 실행하면 다음과 같은 출력이 제공된다는 것입니다.

zsh: argument list too long: ag

그 외에는 내 해결 방법이 작동합니다. 다음과 같은 명령을 실행하여 이를 테스트했습니다.

ag -C 1 --pager="less -R" "regexp1|regexp2" $(comm -12 patter1.txt regexp2.txt | head -10)

문제는 교차 목록이 너무 길어 명령줄에 맞지 않는다는 것입니다. 검색할 파일 목록을 전달하는 옵션이 제공 되면 이 옵션을 건너뛸 수 있지만 ag해당 기능이 없습니다.

어쨌든, 그럴 필요가 없기를 바랍니다. 이 문제에 대한 더 간단한 해결책이 있다고 가정하고 있는데, 그것이 무엇인지 모르겠습니다.


편집: 일부 강조 규칙을 강화하기 위해 다음과 같은 몇 가지 추가 예가 있습니다.

실시예 1

정규식:

regex1 = a.
regex2 = .b

입력하다

file8:
x
x
abc
x
x

산출:

2: x
3: <ab>c
4: x

실시예 2

정규식:

regex1 = foo
regex2 = oba

입력하다

file9:
x
x
foobar
x
x

산출:

2: x
3: <foo>bar
4: x

grep과 ag가 이미 이 작업을 수행했기 때문에 이 출력을 선택했지만 두 경우 모두에 대해 매우 양면적이므로 이러한 예제를 구현하기 어려운 경우 일반적으로 이러한 극단적인 경우에서 상황이 다르게 작동하는지 강조해도 괜찮습니다.내 거정규식은 겹치지 않습니다.

관련 정보