XMLSTARLET을 사용하여 다중 레벨 XML을 모든 레벨을 포함하는 단일 라인으로 변환하는 방법

XMLSTARLET을 사용하여 다중 레벨 XML을 모든 레벨을 포함하는 단일 라인으로 변환하는 방법

샘플 XML은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
  <level01>
    <field01>AAAAAAAAAAAAAAAAAAAA</field01>
    <field02>BBBBBBBB</field02>
    <field03>CCCCCCCCCCCCCCCCCCCC</field03>
    <field04>DDDDDDDDDDDDDDDDDDDD</field04>
    <field05>DDD</field05>
    <level02>
      <field01>EEEEEEEEE</field01>
      <field02>FFF</field02>
      <field04>GGGGGGGGGGs</field04>
      <field05>HHH</field05>
      <level03>
        <field01>IIIIIIIII</field01>
        <field02>JJJ</field02>
        <field04>KKKKKKKKK</field04>
        <field05>L</field05>
      </level03>
    </level02>
  </level01>
</root>

원하는 출력은 다음과 같습니다.

AAAAAA,BBBBB, CCCCCCCCCCCCC ,DDDDDDDDDD ,DDD,EEE,FFF,GGGG,HHH,III,JJJ,KKK,L

답변1

xmlstartlet주장이 좀 까다롭네요. xsl 방식에서는 템플릿(-t)으로 처리해야 합니다.

xmlstarlet sel -B -t -m '//text()' -c 'concat(.,",")' x1.xml

어디:

  • -B: 일반적으로 공백을 제거합니다.
  • -t: xsl 의미의 템플릿
  • -m: xpath exp와 일치
  • -c : xpath exp 사본

이 표현식은 추가 ","를 생성합니다. 물론 일반 Unix 도구를 사용하여 다음을 수행할 수 있습니다.

xmlstarlet sel -B -t -v '//text()' x1.xml | 
    sed -z 's/\n/, /g; s/$/\n/'
  • -t : 템플릿(xsl 의미)
  • -v: 값(xpath 표현식)
  • sed... 트림,

답변2

사용XML2xml2starlet, 및 awk및 대신 (데비안 및 대부분의 다른 배포판에서 사용 가능 paste)

$ xml2 <sdfsdf.xml | awk -F= '{ print $2 }' | paste -sd,
AAAAAAAAAAAAAAAAAAAA,BBBBBBBB,CCCCCCCCCCCCCCCCCCCC,DDDDDDDDDDDDDDDDDDDD,DDD,EEEEEEEEE,FFF,GGGGGGGGGGs,HHH,IIIIIIIII,JJJ,KKKKKKKKK,L

각 쉼표 뒤에 공백을 추가하려면 다음과 같이 추가하세요 sed.

xml2 <sdfsdf.xml | awk -F= '{ print $2 }' | paste -sd, | sed -e 's/,/, /g'

cut대신 사용할 수도 있지만 awk아직 언급하지 않은 다른 기준이 있는 것 같아서 awk지금은 그 기준을 따르겠습니다. 어쨌든 cut버전은 다음과 같습니다.

xml2 <sdfsdf.xml | cut -d= -f2 | paste -sd,

관련 정보