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

관련 정보