二重引用符で囲まれた文字列を1つ抽出する

二重引用符で囲まれた文字列を1つ抽出する

デフォルト モジュールはウィンドウ名を出力するため、現在アクティブなウィンドウ クラスを表示するカスタム ポリバー モジュールを作成しようとしています。

ウィンドウ クラスを取得するには、次のコマンドを使用します。

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

唯一の違いは、二重引用符で囲まれているため、"自体は としてレンダリングされ\"、の代わり'に としてレンダリングされることです。そのため、その出力を に変換してシェルで評価することはそれほど難しくありません。'\'WM_CLASS=$'...'

xpropただし、これを 16 進数値として出力し、次のように変換する方がさらに簡単 (かつ安全) です$'\xHH...'

アプリケーション名(kitty例の最初のもの)の場合:

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

アプリケーション クラス名 (kitty例では 2 番目) の場合:

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

どちらも$WM_CLASSシェル変数を設定します。

これは、プロパティに含まれるバイト値に関係なく機能します。

をサポートするシェルを想定しています$'\xHH'

答え3

方法を試した

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


output

kitty

パイソン

コマンド「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(",","")

関連情報