Сценарий Bash для разбора цветного XML-файла

У меня была такая же проблема, когда я недавно использовал вложенную платформу виртуализации.

Работает после уменьшения MTU с 1500 до 1400 на исходном или целевом сервере.

/sbin/ip link set dev eth0 mtu 1400
0
27.04.2021, 12:32
1 ответ

Учитывая документ XML

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
    <!-- Color Scheme -->
    <color name="primary">#YYYYYY</color>
    <color name="primary_variant">#ZZZZZZ</color>
    <color name="primary_variant">#ZZZZZZ</color>
    <color name="primary_variant_old">#ZZZZZZ</color>
    <color name="primary_variant_new">#ZZZZZZ</color>
</resources>

в file.xml, вы можете использовать утилиту xqдля получения желаемого вывода:

xq -r '.resources.color[] |
    "val " +
    (."@name" | gsub("_(?<a>.)";.a | ascii_upcase) ) +
    " = Color(" +
    (."#text" | sub("#"; "0xFF") ) +
    ")"' file.xml

или, возможно, легче читать,

xq -r '.resources.color[] |
        [ (."@name" | gsub("_(?<a>.)";.a | ascii_upcase) ),
          (."#text" | sub("#"; "0xFF") ) ] |
        "val " +.[0] + " = Color(" +.[1] + ")"' file.xml

Это выбирает каждую запись цвета и вставляет измененное значение атрибута nameи значение узла colorв строку, которая затем выводится.

Атрибут nameпреобразуется в верблюжий -регистр путем преобразования каждого _x(, где x— любой символ )вX(верхний -регистрx). Затем значение узлов colorзаменяется #на 0xFF.

Это выведет

val primary = Color(0xFFYYYYYY)
val primaryVariant = Color(0xFFZZZZZZ)
val primaryVariant = Color(0xFFZZZZZZ)
val primaryVariantOld = Color(0xFFZZZZZZ)
val primaryVariantNew = Color(0xFFZZZZZZ)

Утилита xq— это инструмент для перевода XML в JSON. Инструмент xqзатем становится оболочкой для хорошо известного jqсинтаксического анализатора JSON, поэтому выражения jqмогут использоваться для изменения или общей работы со структурой XML-документа. Он является частью дистрибутива yqутилиты (, первоначально являвшейся оболочкой синтаксического анализатора YAML вокруг jq), как указано в https://kislyuk.github.io/yq/(, утилита yq, доступная через snapв Linux, также является синтаксическим анализатором YAML, но довольно другой инструмент!)

Парсер xq, как и большинство других парсеров, отбрасывает комментарии.


Для справки: это документ JSON, который xqпреобразует приведенный выше XML в:

{
  "resources": {
    "color": [
      {
        "@name": "primary",
        "#text": "#YYYYYY"
      },
      {
        "@name": "primary_variant",
        "#text": "#ZZZZZZ"
      },
      {
        "@name": "primary_variant",
        "#text": "#ZZZZZZ"
      },
      {
        "@name": "primary_variant_old",
        "#text": "#ZZZZZZ"
      },
      {
        "@name": "primary_variant_new",
        "#text": "#ZZZZZZ"
      }
    ]
  }
}
4
28.04.2021, 22:50

Теги

Похожие вопросы