类似 Grep 的工具,用于显示文本相对于模式的特定区域

类似 Grep 的工具,用于显示文本相对于模式的特定区域

我经常发布这样的短信:

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

我想将它通过管道传输到 grep 或任何其他类似的工具,以便显示从“pose:”之后的 12 行开始到“pose:”之后的 20 行的区域。 grep 的基本命令只允许在“pose:”之前或之后显示 n 行,在我的例子中,我想要显示的是这个子消息:

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

有没有任何命令行工具可以做到这一点?

答案1

 awk '/^pose:/{s=NR+11} (NR>s && NR<s+10){print $0}'

当行以 , 开头时pose:s设置为NR+11。 ifNR大于s和小于s+10行被打印。

答案2

答案已替换:

基本上就是从“之后的所有 20 行”中减去“之后的 5 行”的问题

这是我的快速建议

diff <(grep 'pose:' filename -A 20) <(grep 'pose:' filename -A 5)

当然 diff 输出将包含一些额外的标题行和“<”符号,您可能需要过滤掉它们

不过,过滤掉这没什么大不了的

答案3

(grep -A 20 "pose:" file; echo "--")|grep -B 9 '^--'

相关内容