Extraia uma string entre aspas duplas

Extraia uma string entre aspas duplas

Estou tentando criar um módulo polybar personalizado que mostre a classe de janela ativa atual, já que o módulo padrão gera o nome da janela.

Estou usando este comando para obter a classe da janela:

xprop -id $(xdotool getactivewindow) WM_CLASS

e obtendo esta saída:

WM_CLASS(STRING) = "kitty", "kitty"

mas a saída desejada é:

kitty

Como eu posso fazer isso?

Responder1

Você pode se safar:

xprop -id $(xdotool getactivewindow) WM_CLASS | 
    awk -F '"' '{print $2}'

Mas também com (o mais simples):

xprop -id $(xdotool getactivewindow) WM_CLASS | 
    cut -d '"' -f 2

Ou (aviso, se a regex não corresponder, toda a entrada será impressa)

xprop -id $(xdotool getactivewindow) WM_CLASS | 
    sed 's/^[^"]*"\([^"]*\)".*$/\1/'

Ou sed novamente, mas um pouco mais robusto:

xprop -id $(xdotool getactivewindow) WM_CLASS |
    sed -n 's/^[^"]*r"\([^"]*\)".*$/\1/p'

Ou mesmo (não tão robusto) com grep (mas apenas GNU grep e com Perl regex):

xprop -id $(xdotool getactivewindow) WM_CLASS |
    grep -Po  '^[^"]*"\K[^"]*'

É isso que você quer dizer?
Em palavras: extraia a string dentro do primeiro par de aspas, caso contrário, falhará?

Responder2

xpropgera strings em um formato muito semelhante ao das $'...'citações de ksh93/zsh/bash, onde barra invertida, caracteres de controle e não-ASCII são representados como ANSI C \\, \n, \r, \tou \ooonotação.

A única diferença é que, por estarem entre aspas duplas, "ele próprio é renderizado como \"e 'renderizado como 'em vez de \', portanto, não deve ser muito difícil converter essa saída para WM_CLASS=$'...'ser avaliada pelo shell.

No entanto, é ainda mais fácil (e mais seguro) gerar xpropvalores hexadecimais e transformá-los em $'\xHH...':

Para o nome do aplicativo (o primeiro kittyno seu exemplo):

eval "$(
  xprop -id "$(xdotool getactivewindow)" -notype 8x WM_CLASS |
    sed 's/0x/\\x/g;s/[, ]//g;s/\\x0.*/'\''/;s/=/=$'\'/
)"

para o nome da classe do aplicativo (o segundo kittyno seu exemplo):

eval "$(
  xprop -id "$(xdotool getactivewindow)" -notype 8x WM_CLASS |
    sed 's/0x/\\x/g;s/[, ]//g;s/=.*\\x0\(.*\)\\x0/=$'"'\\1'/"
)"

Ambos definem a $WM_CLASSvariável shell.

Isso funcionaria independentemente do valor de byte que a propriedade possa conter.

Assume um shell com suporte para $'\xHH'.

Responder3

Tentei com método

xprop -id $(xdotool getactivewindow) WM_CLASS| awk '{gsub(/[","]/,"",$3);print $3}'


output

kitty

Pitão

a saída do comando "xprop -id $(xdotool getactivewindow) WM_CLASS" é salva na variável "a"

#!/usr/bin/python
import re
a='"WM_CLASS(STRING) = "kitty", "kitty"'
b=a.split(' ')[2]
print b.replace('"','').replace(",","")

informação relacionada