我正在尝试制作一个自定义 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(",","")