提取雙引號之間的一個字串

提取雙引號之間的一個字串

我正在嘗試製作一個自訂 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

唯一的區別是,因為它們用雙引號括起來,所以"本身呈現為\"'呈現為'而不是,因此將該輸出轉換為由 shell 計算\'應該不會太困難。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_CLASSshell 變數。

無論屬性可能包含什麼位元組值,這都會起作用。

假定 shell 支援$'\xHH'.

答案3

嘗試過方法

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


output

kitty

Python

命令“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(",","")

相關內容