awk '/^pose:/{s=NR+11} (NR>s && NR<s+10){print $0}'
Quando a linha começa com pose:
, s
é definido como NR+11
. se NR
for maior que s
e menos que s+10
linhas são impressas.
Eu tenho esse tipo de mensagem de texto publicada em alta frequência:
pose:
-
position:
x: 0.0
y: 0.0
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
-
position:
x: 0.350104982508
y: 0.729534356813
z: -3.10228873344e-06
orientation:
x: -9.84128404362e-07
y: -1.996909502e-06
z: -0.447019362477
w: 0.894524281149
-
position:
x: 0.455011
y: -1.59228
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
Eu quero canalizá-lo para grep ou qualquer outra ferramenta semelhante, a fim de mostrar a área a partir de 12 linhas depois de "pose:" até 20 linhas depois de "pose:". Os comandos básicos para o grep só permitem mostrar n linhas antes ou depois de "pose:", no meu caso o que eu quero mostrar é esta sub-mensagem:
position:
x: 0.350104982508
y: 0.729534356813
z: -3.10228873344e-06
orientation:
x: -9.84128404362e-07
y: -1.996909502e-06
z: -0.447019362477
w: 0.894524281149
Existe alguma ferramenta de linha de comando que possa fazer isso?
Responder SUBSTITUÍDO:
Basicamente, é a questão da subtração de '5 linhas depois de' de 'todas as 20 linhas depois de'
aqui está minha sugestão rápida
diff <(grep 'pose:' filename -A 20) <(grep 'pose:' filename -A 5)
É claro que a saída do diff conterá algumas linhas de títulos extras e '<' sinal, que você pode querer filtrar
isso não é grande coisa para filtrar
(grep -A 20 "pose:" file; echo "--")|grep -B 9 '^--'
Tags grep text-formatting