结合 grep 忽略和匹配

结合 grep 忽略和匹配

我想 grep 一个文件来查找前面fn1没有该单词的文本的所有实例,并打印出匹配之前和之后的四行(即使周围的行中有该单词)。我试过callcall

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

但它没有得到任何匹配(大概是因为[^call])。我不能只使用 -v 并将其通过管道传输到另一个 grep ,反之亦然,因为我想查看周围的文本行。我想我可以使用 -v on call,将其通过管道传输到grep fn1,然后将这些行通过管道传输到 grep 的另一个实例,该实例将整行与上下文相匹配,但这看起来很难看,并且如果有很多匹配项,可能会非常慢。

这看起来应该很简单,但我不确定。有什么帮助吗?

编辑:

样本数据

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

grep使用 Perl 风格的正则表达式 ( -P) 来查找fun前面没有 的任何实例call。并且可以结合-A4 -B4得到-C4.

相关内容