我经常发布这样的短信:
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 '^--'