在 bash 中使用命令行工具解析变体数组
Posted
技术标签:
【中文标题】在 bash 中使用命令行工具解析变体数组【英文标题】:Parse a variant array using command line utils in bash 【发布时间】:2012-02-21 22:44:02 【问题描述】:要在 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'
现在,下面命令的输出是这样的:(为了清楚起见,删掉了)
变体数组 [ 字典条目( 字符串“xesam:艺术家” 变体数组 [ 字符串“黑键” ] ) 字典条目( 字符串“xesam:标题” 变体字符串“放弃你的心” ) ]输出有点长,我想从中解析特定的值,如标题、艺术家等。
谷歌搜索说variant 是组件对象模型中使用的一种流行数据类型,所以我知道有一个比使用 sed/awk 获取值的更好的方法。那么,我该怎么做呢?
【问题讨论】:
与其自己尝试解析,不如使用 dbus 客户端库,例如 python 中的dbus
模块。
我觉得这样做有点矫枉过正,因为我只想知道当前正在播放的歌曲。
@AbhijeetRastogi 使用与您交谈的协议而不是使用文本破解的库几乎永远不会过大。如果你做错了,它就会坏掉。
【参考方案1】:
试试这个
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"
(例如),将需要更改上述脚本。
如果您需要进一步格式化输出以满足您的需要,请告诉我。
我希望这会有所帮助。
【讨论】:
【参考方案2】:下面的作品不管'title'或'artist'以什么顺序进来。唯一的限制是它看到: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"
【讨论】:
以上是关于在 bash 中使用命令行工具解析变体数组的主要内容,如果未能解决你的问题,请参考以下文章
Swift 命令行工具未接收 DistributedNotificationCenter 通知