【问题标题】:Parse a variant array using command line utils in bash在 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 使用与您交谈的协议而不是使用文本破解的库几乎永远不会过大。如果你做错了,它就会坏掉。

标签: linux bash parsing dbus


【解决方案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"
    

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2012-06-25
      相关资源
      最近更新 更多