sedで一致する行の前後のn行範囲を削除しますか?

sedで一致する行の前後のn行範囲を削除しますか?

vimでは利用可能です...

:g/match/-1d

...一致する前に複数行を複数回削除します...

...そしてそれをいくつかの呼び出しと組み合わせます...

:g/match/+1d

...試合終了後に複数行を削除します...

:g/match/-1d,+1d

...前、後、および現在の行を削除...

sedも同じことができますか?

答え1

sedをリクエストしましたが、ed次のようにすることもできます。

$ seq 10 > input
$ ed -s input <<< '/5/ -2, /5/ +2 d'$'\n'w
$ cat input
1
2
8
9
10

これは、edにs2つのコマンドを使用してファイルを自動的に編集するように指示します。input

  1. regexに一致する行から始めて52行を減算し、regexに一致する行で終わり、52行を追加してd範囲を削除します。

(ANSIエスケープされた改行文字で区切られています$'\n'

  1. wファイルをディスクに書き換える

答え2

領域が重なっていない場合は、次のものを使用できます。

sed -zE 's/([^\n]*\n){2}([^\n]*match[^\n]*)(\n[^\n]*){3}/\2/g'

GNUを使用して、一致のsed前の2行と後の3行(の値{})を削除します。

一般的なsed実装では、オプションがないため、-zバッファの行を収集するスキームを使用する必要があり、H;1h;$!d「改行文字を除くすべての操作」は使用できないため、次[^\n]の回避策が必要です。

sed -E 'H;1h;$!d;x;y/\n#/#\n/;s/([^#]*#){2}([^#]*match[^#]*)(#[^#]*){3}/\2/g;y/\n#/#\n/'

どちらのソリューションもパターンスペース内のファイル全体に対して機能するため、大容量ファイルには使用しないでください。

関連情報