このようなファイルが与えられると
asdasd
123
X
456
X
789
asd
asd
asd
asd
grep: を実行すると、grep -C3 'X'
次の結果が表示されます。
asdasd
123
X
456
--
456
X
789
asd
asd
grep は、各一致のコンテキストを前または次の一致のみに表示するようです。パターンが含まれているかどうかに関係なく、コンテキスト全体を表示させる方法はありますか?見てみるとman grep
そんな選択肢はないようです。予想される結果は次のとおりです。
asdasd
123
X
456
X
789
--
123
X
456
X
789
asd
asd
答え1
これはこれを行う短いPerlスクリプトです。ファイル全体がメモリに読み込まれるため、非常に大きなファイルには適していない可能性があります。
perl -0777 -snE '
@lines = split /\n/;
for $idx (grep {$lines[$_] =~ $p} 0...$#lines) {
say join "\n", @lines[$idx-($n-1) .. $idx+($n-1)], "--";
}
' -- -n=3 -p='X' file