Extrae una cadena entre comillas dobles

Extrae una cadena entre comillas dobles

Estoy intentando crear un módulo de barra polivinílica personalizado que muestre la clase de ventana activa actual, ya que el módulo predeterminado genera el nombre de la ventana.

Estoy usando este comando para obtener la clase de ventana:

xprop -id $(xdotool getactivewindow) WM_CLASS

y obteniendo este resultado:

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

pero el resultado deseado es:

kitty

¿Cómo puedo hacer eso?

Respuesta1

Puedes salirte con la tuya:

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

Pero también con (el más simple):

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

O (advertencia, si la expresión regular no coincide, se imprimirá toda la entrada)

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

O sed de nuevo, pero un poco más robusto:

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

O incluso (no tan robusto) con grep (pero solo grep GNU y con expresiones regulares de Perl):

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

¿Es eso lo que quieres decir?
En palabras: ¿extrae la cadena dentro del primer par de comillas; de lo contrario, falla?

Respuesta2

xpropgenera cadenas en un formato muy similar al de las $'...'comillas de ksh93/zsh/bash donde la barra invertida, el control y los caracteres no ASCII se representan como su notación ANSI C \\, \no .\r\t\ooo

La única diferencia es que debido a que están entre comillas dobles, "se representa como \"y 'se representa como 'en lugar de \', por lo que no debería ser demasiado difícil convertir esa salida para que WM_CLASS=$'...'la evalúe el shell.

Sin embargo, es aún más fácil (y seguro) generarlo xpropcomo valores hexadecimales y transformarlo a $'\xHH...':

Para el nombre de la aplicación (el primero kittyen su ejemplo):

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

para el nombre de la clase de aplicación (el segundo kittyen su ejemplo):

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

Ambos establecen la $WM_CLASSvariable de shell.

Eso funcionaría independientemente del valor de byte que pueda contener la propiedad.

Se supone un shell con soporte para $'\xHH'.

Respuesta3

Probado con el método

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


output

kitty

pitón

la salida del comando "xprop -id $(xdotool getactivewindow) WM_CLASS" se guarda en la variable "a"

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

información relacionada