두 줄 사이의 문자열 자르기

두 줄 사이의 문자열 자르기

저는 위치와 측면에 따라 창을 관리하기 위해 Linux에서 스크립트를 작성하고 있습니다. xwininfo -id ID -all특히 최대화 및 전체 화면인 경우 창 정보를 표시하는 데 사용하는 것은 다음과 같은 결과를 반환합니다.

xwininfo: Window id: 0x2200001 "Newest 'bash' Questions - Unix & Linux Stack Exchange - Google Chrome"

    [......]

  Window manager hints:
      Client accepts input or input focus: Yes
      Initial state is Normal State
      Displayed on desktop 0
      Window type:
          Normal
      Window state:
          Maximized Horz
          Maximized Vert
          Fullscreen
          Focused
      Process id: 63354 on host antonio-ThinkPad

  Normal window size hints:
      Program supplied minimum size: 121 by 127
   
    [.......]

예를 들어 개별 줄을 잃지 않고 Window manager hints:Normal window size hints(독점) 사이의 모든 것을 추출하여 이름이 지정된 변수에 저장하고 싶습니다 . $info나는 그것을 시도했지만 awk성공 sed하지 못했습니다. 저는 전문 프로그래머가 아니므로 미리 감사드립니다 :)

제안된 예상 출력:

  Client accepts input or input focus: Yes
  Initial state is Normal State
  Displayed on desktop 0
  Window type:
      Normal
  Window state:
      Maximized Horz
      Maximized Vert
      Fullscreen
      Focused

아니요, 다른 곳에서는 나타나지 않습니다.

답변1

그러면 사이에 있는 두 줄을 제외하고 두 줄이 인쇄됩니다.

awk '/Window manager hints:/{flag=1; next} /Normal window size hints/{flag=0} flag' file.txt

산출:

     Displayed on desktop 0
     Window type:
         Normal
     Window state:
         Maximized Horz
         Maximized Vert
[.......]

여기에는 두 줄이 포함됩니다.

awk '/Window manager hints:/,/Normal window size hints/' file.txt

산출:

 Window manager hints:
     Displayed on desktop 0
     Window type:
         Normal
 Window state:
     Maximized Horz
     Maximized Vert
[.......]

위 명령은 파일에 대해 실행되지만 다음 명령을 통해 파이프할 수도 있습니다.

xwininfo -id ID -all | awk '/Window manager hints:/{flag=1; next} /Normal window size hints/{flag=0} flag'

또는

xwininfo -id ID -all | '/Window manager hints:/,/Normal window size hints/'

답변2

다음을 시도해 볼 수 있습니다.

xwininfo -id ID -all | awk -v RS="" '/^ *Window manager hints/{sub(/^[^\n]*\n/,"");print}'

관련 블록을 추출합니다. 이는 awk각 "빈 줄로 구분된" 블록이 하나의 레코드로 처리되는 "단락 모드" 에서 사용됩니다 . 그런 다음 레코드가 앞에 공백이 올 수 있는 "창 관리자 프롬프트"로 시작하는지 확인하면 됩니다. 그렇다면 첫 번째 줄을 제거하고 관심 있는 텍스트 블록이 될 레코드를 인쇄합니다.

이를 쉘 스크립트에서 사용하고 출력을 쉘 변수로 가져오려면 다음과 같이 "명령 대체"에 배치하십시오.

info="$(xwininfo -id ID -all | awk -v RS="" '/^ *Window manager hints/{sub(/^[^\n]*\n/,"");print}')"

이렇게 하면 "올바른 변수 참조(TM)"로 인해 줄 바꿈을 포함한 전체 구조가 보존됩니다.

관련 정보