Я пытаюсь создать пользовательский модуль 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
Единственное отличие состоит в том, что поскольку они заключены в двойные кавычки, "
то сам отображается как \"
и '
отображается как '
вместо \'
, поэтому не должно быть слишком сложно преобразовать этот вывод в для 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
переменную оболочки.
Это будет работать независимо от того, какое байтовое значение может содержать свойство.
Предполагается, что оболочка поддерживает $'\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(",","")