在 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 通知

Xcode命令行简单了解一下

Apache Commons CLI 开发命令行工具示例

在 Bash 中解析命令行参数的最佳方法是啥?

scrapy1.0手册--01--命令行工具(Command line tools)

如何在Bash包装器脚本中使用工具的所有命令行参数?