デフォルト モジュールはウィンドウ名を出力するため、現在アクティブなウィンドウ クラスを表示するカスタム ポリバー モジュールを作成しようとしています。
ウィンドウ クラスを取得するには、次のコマンドを使用します。
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(",","")