Eu sugeriria o processamento de awk
(que, acredito, será mais flexível e robusto):
awk '/^\* i/ && ++c == 2{ print r ORS; r=""; c=0 }
{ r=(r? r ORS:"")$0 }
END{ print r }' file
A saída:
* misc: go to the park
with your dog
* important: sell badges
the bigger the pricier
24 left right now
* important: go to the mall
get clothes
* important: finish homework
Para o seu caso simples atual (sem lógica adicional) - pode ser encurtado para o seguinte:
awk '/^\* i/ && ++c == 2{ print "" }1' file
Para extrair a parte necessária separadamente - ainda com um único comando awk
, mas usando o argumento dinâmico part
, que aceita o valor condicional 1
(primeira seção, seção anterior) ou 2
(segunda seção, seção seguinte) ).
Esquema:
awk -v part=[12] '/^\* i/ && ++c == 2{ if (part == 1) exit; else f=1 }
part == 1 || (part == 2 && f)' FILE
Uso:
- imprima "antes" seção:
$ awk -v part=1 '/^\* i/ && ++c==2{ if (part==1) exit; else f=1 }
> part==1 || (part==2 && f)' file
* misc: go to the park
with your dog
* important: sell badges
the bigger the pricier
24 left right now
- imprima "depois de" seção:
$ awk -v part=2 '/^\* i/ && ++c==2{ if (part==1) exit; else f=1 }
> part==1 || (part==2 && f)' file
* important: go to the mall
get clothes
* important: finish homework