No vim eu posso usar...
:g/match/-1d
...várias vezes para deletar mais de uma linha antes de uma partida...
...e combiná-lo com algumas chamadas para...
:g/match/+1d
...para excluir mais de uma linha após a correspondência...
:g/match/-1d,+1d
...para deletar as linhas anteriores e atuais...
o mesmo pode ser feito com sed?
Você pediu sed, mas
ed
também pode fazer isso:Isso diz ao ed para
s
editar silenciosamente oinput
arquivo com dois comandos:5
, menos duas linhas e terminando na linha que corresponde ao regex5
, mais duas linhas,d
exclua esse intervalo(separado por uma nova linha com escape ANSI
$'\n'
)w
rite o arquivo de volta para o discoSe as regiões não se sobrepõem, você pode usar
com GNU
sed
, para remover duas linhas antes e três depois da correspondência (os valores no{}
).Com
sed
implementações gerais, você não tem opção-z
, então você precisa coletar linhas no buffer com oH;1h;$!d
esquema e não pode fazer "tudo menos nova linha" com[^\n]
, então você precisa de uma solução alternativa como esta:Ambas as soluções funcionam em todo o arquivo no espaço do padrão, então não use isso para arquivos grandes.