Разобрать вариантный массив, используя утилиты командной строки в bash - PullRequest
1 голос
/ 30 января 2012

Чтобы получить текущую песню, воспроизводимую в 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"
     )
     ]

Вывод немного длинный, и я хочу разобрать из него определенные значения, такие как название, исполнитель и т. Д.

Гугл сказал, что вариант популярный тип данных, используемый в объектной модели компонентов, поэтому я понял, что есть лучший способ , чем использование sed / awk для получения значений. Итак, как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Попробуйте это

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"

(например), потребует изменений в приведенном выше сценарии.

Дайте мне знать, если вам нужна помощь в дальнейшем форматировании вывода.

Надеюсь, это поможет.

1 голос
/ 30 января 2012

Следующее работает независимо от того, в каком порядке появляются «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"
...