Excluindo um intervalo de n linhas antes e depois de uma linha correspondente no sed?

0

No vim eu posso usar ...

:g/match/-1d

... várias vezes para excluir mais de uma linha de antes de uma correspondência ...

... e combine-o com algumas chamadas para ...

:g/match/+1d

... para excluir mais de uma linha após a partida ...

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

... para excluir antes e depois das linhas atuais ...

o mesmo pode ser feito com sed?

    
por leeand00 11.05.2018 / 12:35

2 respostas

1

Você pediu sed, mas ed também pode fazer isso:

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

Isso é dito para s illy editar o arquivo input com dois comandos:

  1. começando na linha que corresponde à regex 5 , menos duas linhas e terminando na linha que corresponde à regex 5 , mais duas linhas, d elete esse intervalo

(separado com uma nova linha de escape com escape de $'\n' )

  1. w rite o arquivo de volta para o disco
por 11.05.2018 / 17:43
1

Se as regiões não se sobrepuserem, você pode usar

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

com GNU sed , para remover duas linhas antes e três após a correspondência (os valores em {} ).

Com implementações gerais de sed , você não tem a opção -z , portanto, é necessário coletar linhas no buffer com o esquema H;1h;$!d e não pode fazer "tudo menos a nova linha" com [^\n] , então você precisa de uma solução alternativa como esta:

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

Ambas as soluções funcionam em todo o arquivo no espaço padrão, portanto, não use isso para arquivos grandes.

    
por 11.05.2018 / 13:26