2011-04-27 3 views
1

글쎄, 기본적으로 xml 파일을 입력 받아 특정 XML 태그의 텍스트를 추출하는 스크립트를 작성했습니다. 그러나 다중 행 텍스트를 가져 와서 특수 문자를 허용 할만큼 똑똑하지는 않습니다. 텍스트 형식은 태그 아래 정의 된대로 그대로 유지해야합니다.sed - shell 스크립트를 사용하여 XML 태그에서 텍스트를 추출하십시오.

<nick>Deminem</nick> 
<company>XYZ Solutions</company> 
<description> 
    /** 
    * 
    * «Lorem» ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy 
    * tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
    * At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd 
    * no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit 
    * consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore 
    * magna aliquyam erat, sed diam voluptua. 
    * 
    **/ 
</description> 

위의 스크립트는 각각의 특정 태그의 텍스트를 추출하고 새로운 valueArray에 할당 :

다음은 XML 입력입니다. sed에 대한 나의 명령은 기본이지만 항상 여분의 마일을 기꺼이 가려고합니다.

tagsArray=(nick company description) 
noOfElements=${#tagsArray[@]} 

for ((i=0;i<$noOfElements;i++)); do 

OUT=`grep ${tagsArray[${i}]} filename.xml | tr -d '\t' | sed -e 's/^<.*>\([^<].*\)<.*>$/\1/' ` 

valueArray[${i}]=${OUT} 
done 

답변

3

XML을 regexp로 구문 분석하면 궁극적으로 문제가 발생합니다. 예를 들어 xsltproc을 사용하여 XML을 적절히 변환하기에 충분한 XSL (많은 숫자가 tutorials)을 배우십시오.

편집 :

몇 가지 명령 줄 XML 유틸리티를 시도 후, 나는 xmlstarlet 당신을위한 도구가 될 수 있다고 생각. 다음은 테스트되지 않았으며 filename.xml이 올바른 xml 파일 (즉 단일 루트 요소 있음)이라고 가정합니다.

tagsArray=(nick company description) 
noOfElements=${#tagsArray[@]} 

for ((i=0;i<$noOfElements;i++)); do 
    valueArray[${i}] = `xmlstarlet sel -t -v "/root/$tagsArray[i]" filename.xml` 
done 
+1

@AnderLindahi - 이러한 도구는 스마트 XML 처리를 위해 의미되지 않기 때문에 그래 그 나오지도/AWK를 통해 진정한 구문 분석 XML은 쉬운 일이 아니다입니다. 하지만 안타깝게도 sed를 사용하는 ** schell 스크립트 **를 고수하는 것이 제 요구 사항입니다. – Deminem

+0

@AnserLindahi - [xsltproc] (http://linuxcommand.org/man_pages/xsltproc1.html)은 Mac OSX 및 Unix가 사전 설치된 패키지로 제공됩니까? – Deminem

+1

@Deminem : 셸 스크립트를 사용하기 위해서는 스크루 드라이버로 나무를 자르는 것과 같은 방법이 필요합니다. 그것은 할 수 있지만 꽤되지 않습니다. –

0
#!/bin/sh 
filePath=$1 #XML file path 
tagName=$2 #Tag name to fetch values 
awk '!/<.*>/' RS="<"$tagName">|</"$tagName">" $filePath 
+0

RS 정의는 꽤 이상합니다. 변수가 큰 따옴표 안에 대체되므로 따옴표로 묶은 문자열에서 변수를 제외 할 이유가 없습니다. 변수 이름에 대해 좀 더 명확하게 나타내려면 항상 중괄호로 묶을 수 있습니다. 'RS = "<${tagName}> |"입니다. 그러나 모든 것을 제외하고 정규 표현식은 중첩 될 수 있기 때문에 XML 구문 분석에 충분하지 않습니다. 예를 들어, 동일한 이름의 태그를 자체 내에 포함 할 수 있으면이 코드는 실패합니다. – danfuzz

관련 문제