큰따옴표 사이에 하나의 문자열을 추출합니다.

큰따옴표 사이에 하나의 문자열을 추출합니다.

기본 모듈이 창 이름을 출력하므로 현재 활성 창 클래스를 표시하는 사용자 정의 폴리바 모듈을 만들려고 합니다.

이 명령을 사용하여 창 클래스를 가져옵니다.

xprop -id $(xdotool getactivewindow) WM_CLASS

그리고 다음 출력을 얻습니다.

WM_CLASS(STRING) = "kitty", "kitty"

하지만 원하는 출력은 다음과 같습니다.

kitty

내가 어떻게 그걸 할 수 있지?

답변1

다음과 같은 상황에서 벗어날 수 있습니다.

xprop -id $(xdotool getactivewindow) WM_CLASS | 
    awk -F '"' '{print $2}'

그러나 또한 (더 간단하게):

xprop -id $(xdotool getactivewindow) WM_CLASS | 
    cut -d '"' -f 2

또는 (경고, 정규식이 일치하지 않으면 전체 입력이 인쇄됩니다)

xprop -id $(xdotool getactivewindow) WM_CLASS | 
    sed 's/^[^"]*"\([^"]*\)".*$/\1/'

또는 다시 sed를 실행하지만 좀 더 강력해졌습니다.

xprop -id $(xdotool getactivewindow) WM_CLASS |
    sed -n 's/^[^"]*r"\([^"]*\)".*$/\1/p'

또는 grep을 사용하는 경우에도 (그다지 강력하지는 않지만) (GNU grep 및 Perl 정규 표현식만 사용):

xprop -id $(xdotool getactivewindow) WM_CLASS |
    grep -Po  '^[^"]*"\K[^"]*'

이게 네가 말하는거야?
즉, 첫 번째 따옴표 쌍 안에 있는 문자열을 추출하고, 그렇지 않으면 실패합니까?

답변2

xprop$'...'백슬래시, 제어 및 비ASCII 문자가 ANSI C \\, \n, \r또는 표기법 \t으로 표시되는 ksh93/zsh/bash의 인용과 매우 유사한 형식으로 문자열을 출력합니다 .\ooo

유일한 차이점은 큰따옴표로 묶여 있기 때문에 자체가 대신 "로 렌더링되고 \"으로 '렌더링 되므로 해당 출력을 셸에서 평가하도록 변환하는 것이 그리 어렵지 않아야 한다는 것입니다 .'\'WM_CLASS=$'...'

xprop그러나 16진수 값으로 출력하고 다음으로 변환하는 것이 훨씬 더 쉽고 안전합니다 $'\xHH...'.

애플리케이션 이름( kitty예제의 첫 번째 이름):

eval "$(
  xprop -id "$(xdotool getactivewindow)" -notype 8x WM_CLASS |
    sed 's/0x/\\x/g;s/[, ]//g;s/\\x0.*/'\''/;s/=/=$'\'/
)"

애플리케이션 클래스 이름( kitty예제에서는 두 번째):

eval "$(
  xprop -id "$(xdotool getactivewindow)" -notype 8x WM_CLASS |
    sed 's/0x/\\x/g;s/[, ]//g;s/=.*\\x0\(.*\)\\x0/=$'"'\\1'/"
)"

둘 다 $WM_CLASS쉘 변수를 설정합니다.

이는 속성에 포함된 바이트 값에 관계없이 작동합니다.

을 지원하는 쉘을 가정합니다 $'\xHH'.

답변3

방법으로 시도했습니다.

xprop -id $(xdotool getactivewindow) WM_CLASS| awk '{gsub(/[","]/,"",$3);print $3}'


output

kitty

파이썬

"xprop -id $(xdotool getactivewindow) WM_CLASS" 명령의 출력은 변수 "a"에 저장됩니다.

#!/usr/bin/python
import re
a='"WM_CLASS(STRING) = "kitty", "kitty"'
b=a.split(' ')[2]
print b.replace('"','').replace(",","")

관련 정보