私はしばしば次のようなテキストメッセージを投稿します。
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
。行NR
より大きい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 '^--'