パターンに基づいて特定のテキスト領域を表示するための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。行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 '^--'

関連情報