2012-12-21 3 views
1

다음 XML을 가지고 있습니다. 각각의 노드를 반복하고, <extern> == 1이라면 <url>xml을 파싱하고 bash 배열에 데이터를 입력하십시오.

값을 bash 배열에 넣고 싶습니다. 어떻게해야할까요?

<GraphXML> 
     <graph isDirected="true"> 
     <node name="0"> 
      <label>font</label> 
      <url>http://fonts.googleapis.com/css?</url> 
      <data> 
      <checktime>0.262211</checktime> 
      <extern>1</extern> 
      </data> 
     </node> 
     <node name="1"> 
      <label>logo</label> 
      <url>http://example.com/example.png</url> 
      <data> 
      <dlsize>7545</dlsize> 
      <checktime>0.280600</checktime> 
      <extern>0</extern> 
      </data> 
     </node> 
    </graph> 
    </GraphXML> 

답변

2

사용 xmllint가 :

out=$(echo "cat /GraphXML/graph/node/url|/GraphXML/graph/node/data/extern" | \ 
     xmllint --shell input | sed 's/<[^>]*>//g;s/[-][-]*//g;s/\/[^>]*>//') 
set $out 
i=0 
while [ $# -gt 0 ] ; do 
    url=$1 
    shift 
    extern=$1 
    shift 
    if [ $extern -eq 1 ]; then 
    array[$i]=$url 
    let i++ 
    fi 
done 

echo ${array[*]} 
1

사용 bash는

#!/bin/bash 
declare -a ARR 
while read -r line; do 
    if [[ "$line" =~ ^\<(url|extern)\>(.*)\</[^\>]*\>$ ]]; then 
     if [ "${BASH_REMATCH[1]}" == "extern" ]; then 
      ((${BASH_REMATCH[2]} == 0)) && unset ARR[${#ARR[@]}-1] 
     else 
      ARR+=("${BASH_REMATCH[2]}") 
     fi 
    fi 
done < <(grep -oE '<(url|extern)>.*</(url|extern)>' file.xml) 

echo "${ARR[@]}" 

설명

  • grep -oE는 - 확장 된 정규식 -E를 사용 하나 url 또는 extern와 리턴 매치 -o
  • done < <(을 일치 - while 루프에 grep를 공급하는 Process Substitution를 사용합니다.
  • while read -r line - EOF까지 줄을 읽은 다음 while이 종료 될 때까지 줄을 읽습니다.
  • ^\<(url|extern)\>(.*)\</[^\>]*\>$ - 행과 일치하고 BASH_REMATCH 배열에 저장합니다.
  • unset ARR[${#ARR[@]}-1]은 - 통근 속성 값은 0
  • ARR+=(...) 경우 배열의 마지막 요소를 제거 - 짧은 형태의 배열에 새로운 요소를 추가 할 수 있습니다.
관련 문제