XMLカラーファイルを解析するBashスクリプト

XMLカラーファイルを解析するBashスクリプト

Kotlinに対応する色に変換したいXMLカラーファイルがあります。この入力ファイルが与えられると

color.xml

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

これが私が探している結果です

color.kt

// Color Scheme
val primary = Color(0xFFYYYYYY)
val primaryVariant = Color(0xFFZZZZZZ)
...

これを行うためにPythonスクリプトを書いたが、まだ熟練していないシェルソリューションの複雑さの違いに興味があります。

具体的に私が探しているものは次のとおりです。

  • コメントはKotlinのコメントにマップされます。
  • 改行は維持しますが、インデントは維持しません。
  • snake_caseからcamelCaseに変換された変数名

ベストアンサー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

これにより、各カラーアイテムが選択され、変更された属性namecolorノード値が後続の出力文字列に挿入されます。

属性は、各(文字がある場所)を(大文字)に変換してnamecamelCaseに変換されます。これにより、ノード値がに置き換えられます。_xxXxcolor#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よく知られているJSONパーサーjqのラッパーになるため、jq式を使用してXML文書構造を変更したり、一般的に使用したりできます。これはユーティリティ配布yq(元のYAMLパーサーラッパーjq)の一部であり、次の場所にあります。https://kislyuk.github.io/yq/ (Linuxでyq利用可能なユーティリティsnapもYAMLパーサーですが、まったく異なるツールです!)

xq他のほとんどのパーサーと同様に、パーサーはコメントを削除します。


xqちなみに、上記のXMLを変換したJSONドキュメントは次のとおりです。

{
  "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"
      }
    ]
  }
}

おすすめ記事