패턴을 기준으로 특정 텍스트 영역을 표시하기 위한 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 '^--'

관련 정보