샘플 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,