grepを無視して一致を組み合わせる

grepを無視して一致を組み合わせる

fn1ファイルをgrepして単語の前にないテキストのすべてのインスタンスを見つけ、一致の前後の4行を印刷したい(単語が周囲の行にあっても)。頑張った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

おすすめ記事