を使用して、grep
特定のパターンと一致し、他のパターンと一致しないすべての行を選択したいと思います。オプション(または)をgrep
使用できるように単一の呼び出しを使用したいと思います。--after-context
--before-context
--context
-v
grep
そのオプションを使用するために渡すすべてのパターンを無効にするため、ここでは機能しません-e
。
はい
一致する行を検索し、一致needle
する行を無視し、ignore me
コンテキストの下に1行あります。
これは私の入力ファイルです。
one needle ignore me
two
three
four needle
five
私が望む出力は次のとおりです。
four needle
five
ご覧のとおり、この単純なソリューションは機能しません。
$ cat file | grep --after-context=1 needle | grep -v 'ignore me'
two
---
four needle
five
ベストアンサー1
GNU grepがある場合は、次のものを使用できます。パール正規表現、その一つ否定的な構造。
grep -A1 -P '^(?!.*ignore me).*needle'
GNU grepがない場合は、次のことができます。awkでコンテキストオプションをエミュレートします。。
awk -v after=3 -v before=2 '
/needle/ && !/ignore me/ {
for (i in h) {
print h[i];
delete h[i];
}
until = NR + after;
}
{
if (NR <= until) print $0; else h[NR] = $0;
delete h[NR-before];
}
END {exit !until}
'