我正在嘗試製作一個自訂 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
xprop
以與 ksh93/zsh/bash 引用的格式非常相似的格式輸出字串,其中反斜線、控製字元$'...'
和非 ASCII 字元表示為其 ANSI C \\
、\n
、\r
或符號。\t
\ooo
唯一的區別是,因為它們用雙引號括起來,所以"
本身呈現為\"
並'
呈現為'
而不是,因此將該輸出轉換為由 shell 計算\'
應該不會太困難。WM_CLASS=$'...'
然而,將xprop
其輸出為十六進制值並轉換為更容易(也更安全) $'\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
shell 變數。
無論屬性可能包含什麼位元組值,這都會起作用。
假定 shell 支援$'\xHH'
.
答案3
嘗試過方法
xprop -id $(xdotool getactivewindow) WM_CLASS| awk '{gsub(/[","]/,"",$3);print $3}'
output
kitty
Python
命令“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(",","")