Извлечь одну строку между двойными кавычками

Извлечь одну строку между двойными кавычками

Я пытаюсь создать пользовательский модуль 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(",","")

Связанный контент