提取双引号之间的一个字符串

提取双引号之间的一个字符串

我正在尝试制作一个自定义 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(",","")

相关内容