Extrahieren Sie eine Zeichenfolge zwischen doppelten Anführungszeichen

Extrahieren Sie eine Zeichenfolge zwischen doppelten Anführungszeichen

Ich versuche, ein benutzerdefiniertes Polybar-Modul zu erstellen, das die aktuell aktive Fensterklasse anzeigt, da das Standardmodul den Fensternamen ausgibt.

Ich verwende diesen Befehl, um die Fensterklasse zu erhalten:

xprop -id $(xdotool getactivewindow) WM_CLASS

und erhalte diese Ausgabe:

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

aber die gewünschte Ausgabe ist:

kitty

wie kann ich das machen?

Antwort1

Möglicherweise kommen Sie damit durch:

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

Aber auch mit (dem einfacheren):

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

Oder (Achtung, wenn der reguläre Ausdruck nicht übereinstimmt, wird die gesamte Eingabe ausgedruckt)

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

Oder noch einmal sed, aber etwas robuster:

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

Oder sogar (nicht so robust) mit grep (aber nur GNU grep und mit Perl regex):

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

Meinen Sie das?
In Worten: Extrahieren Sie die Zeichenfolge innerhalb des ersten Anführungszeichenpaars, andernfalls tritt ein Fehler auf?

Antwort2

xpropgibt Zeichenfolgen in einem Format aus, das dem der Anführungszeichen von ksh93/zsh/bash sehr ähnlich ist, wobei Backslash, Steuerzeichen und Nicht-ASCII-Zeichen in ihrer ANSI-C- , , , oder -Notation $'...'dargestellt werden .\\\n\r\t\ooo

Der einzige Unterschied besteht darin, dass aufgrund der Einschließung in doppelte Anführungszeichen "selbst als \"und als statt als 'wiedergegeben wird . Es sollte also nicht zu schwierig sein, diese Ausgabe so umzuwandeln, dass sie von der Shell ausgewertet werden kann.'\'WM_CLASS=$'...'

Es ist jedoch noch einfacher (und sicherer), xpropes als Hexadezimalwerte auszugeben und wie folgt umzuwandeln $'\xHH...':

Für den Anwendungsnamen (der erste kittyin Ihrem Beispiel):

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

für den Namen der Anwendungsklasse (die zweite kittyin Ihrem Beispiel):

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

Beide setzen die $WM_CLASSShell-Variable.

Dies würde unabhängig davon funktionieren, welchen Bytewert die Eigenschaft enthalten könnte.

Setzt eine Shell mit Unterstützung für voraus $'\xHH'.

Antwort3

Mit Methode versucht

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


output

kitty

Python

Die Ausgabe des Befehls „xprop -id $(xdotool getactivewindow) WM_CLASS“ wird in der Variable „a“ gespeichert.

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

verwandte Informationen