grep 무시와 일치 결합

grep 무시와 일치 결합

fn1파일을 grep하여 단어 앞에 없는 텍스트의 모든 인스턴스를 찾고 일치 전후의 네 줄을 인쇄하고 싶습니다 (단어가 주변 줄에 있더라도). 나는 노력했다callcall

grep -A 4 -B 4 '[^call].+fn1'

그러나 일치하는 항목이 없습니다(아마도 [^call]). 주변 텍스트 줄을 보고 싶기 때문에 -v를 사용하여 다른 grep으로 파이프하거나 그 반대로 파이프할 수는 없습니다. -v on 을 사용하여 call파이프한 다음 컨텍스트에 대해 전체 라인과 일치하는 grep의 다른 인스턴스로 라인을 파이프할 수 있다고 가정합니다 grep fn1. 그러나 이는 보기 흉하고 일치하는 항목이 많으면 매우 느릴 수 있습니다.

간단해야 할 것 같지만 잘 모르겠습니다. 도움이 필요하세요?

편집하다:

견본

main code
main code
more main code
call fn1(ii, jj)
even more main code
call fn2
still more main code

function fn1
call fn3
fn1 code
more fn1 code

grep이 돌아오길 원합니다

call fn2
still more main code

function fn1
call fn3
fn1 code
more fn1 code

fn1을 사용하는 모든 인스턴스를 표시하고 싶습니다.와는 별개로호출될 때 컨텍스트에서 호출되는 다른 함수를 놓치고 싶지 않습니다.

답변1

정규식을 부정하는 것은 쉽지 않습니다. 당신이 사용할 수있는부정적인 리뷰:

$ grep -C4 -P '(?<!call).*fn1' test.txt 
5-even more main code
6-call fn2
7-still more main code
8-
9:function fn1
10-call fn3
11-fn1 code
12-more fn1 code

이는 grepPerl 스타일 정규식( )을 사용하여 이전에 발견되지 않은 인스턴스를 -P찾습니다 . 그리고 결합될 수 있습니다 .funcall-A4 -B4-C4

관련 정보