Ferramenta semelhante a Grep para mostrar uma região específica de um texto em relação a um padrão

0

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?

    
por Mehdi 04.03.2016 / 10:58

3 respostas

2
 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.

    
por 04.03.2016 / 11:31
1

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

    
por 04.03.2016 / 11:09
0
(grep -A 20 "pose:" file; echo "--")|grep -B 9 '^--'
    
por 04.03.2016 / 12:49