要在spotify中播放当前歌曲(使用DBus),我使用以下命令:
dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'
现在,下面命令的输出如下:(为了清晰起见,将其拆除)
variant array [ dict entry( string "xesam:artist" variant array [ string "The Black Keys" ] ) dict entry( string "xesam:title" variant string "Give Your Heart Away" ) ]
输出有点长&我想解析标题,艺术家等的具体价值。
谷歌搜索说variant是组件对象模型中使用的一种流行数据类型,所以我得到的是更好的方式,而不是使用sed / awk来获取值。那么,我该怎么做呢?
答案 0 :(得分:3)
试试这个
awk '
/string *"xesam:artist/{
while (1) {
getline line
if (line ~ /string "/){
sub(/.*string "/, "artist:", line)
sub(/".*$/, "", line)
print line
break
}
}
}
/string *"xesam:title/{
while (1) {
getline line
if (line ~ /string "/){
sub(/.*string "/, "title:", line)
sub(/".*$/, "", line)
print line
break
}
}
}
' variantArraySample.txt
提供输出
artist:The Black Keys
title:Give Your Heart Away
这假设输入之间始终存在至少1行差异,即
string "xesam:title"
variant string "Give Your Heart Away"
也就是说,如果您的数据全部汇总到一行,则需要进一步的逻辑,所以
string "xesam:title" variant string "Give Your Heart Away"
(例如),需要更改上述脚本。
如果您需要帮助我根据需要进一步格式化输出,请告诉我。
我希望这会有所帮助。
答案 1 :(得分:1)
无论“标题”或“艺术家”的顺序是什么,以下情况都有效。唯一的限制是,在看到:title
之后,包含string
的下一行必须是标题字符串;尽管这条线有多远并不重要。同样对于艺术家
awk '
/:artist/{a=1;next}
/:title/{t=1;next}
a && /string/{
sub(/^.*string /,"")
artist=$0
a=0; next
}
t && /string/{
sub(/^.*string /,"")
title=$0
t=0;next
}
END{
printf("artist:%s\n title:%s\n", artist,title)
}'
artist:"The Black Keys"
title:"Give Your Heart Away"