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にs
2つのコマンドを使用してファイルを自動的に編集するように指示します。input
- regexに一致する行から始めて
5
2行を減算し、regexに一致する行で終わり、5
2行を追加してd
範囲を削除します。
(ANSIエスケープされた改行文字で区切られています$'\n'
)
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/'
どちらのソリューションもパターンスペース内のファイル全体に対して機能するため、大容量ファイルには使用しないでください。