큰따옴표 사이의 문자열 추출

큰따옴표 사이의 문자열 추출

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

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

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

xpropksh93/zsh/bash에서 참조하는 것과 매우 유사한 형식으로 문자열을 출력합니다. 여기서 백슬래시, 제어 문자 $'...'및 비ASCII 문자는 ANSI C \\, \n또는 \r기호로 표시됩니다.\t\ooo

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

그러나 xprop16진수 값으로 출력하고 다음으로 변환하는 것이 더 쉽고 안전합니다 $'\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(",","")

관련 정보