2013-05-16 2 views
0

나는 (적어도 나를 위해) 흥미로운 문제에 부딪 혔습니다. 의 XML 파일을 보자XML 쌍을 bash로 구문 분석합니다.

<a>pair1a</a> 
<b>pair1b</b> 
<c>randomtext</c> 
<a>pair2a</a> 
<b>pair2b</b> 
... 

<b> 태그 <a> 태그 뒤에 항상 간다. 내가 원하는 것은 <a><b> 사이의 내용을 저장하고 함께 연결하는 것입니다. bash에서이 문제를 어떻게 해결해야 데이터에 쉽게 액세스하고 관리 할 수 ​​있습니까? 연관 배열이나 모든 것을 한 배열에 넣고 b의 내용을 구분 기호로 구분하는 방법을 생각했습니다. (까다로울 수도 있습니다.) 내 접근 방식은 모든 것을 두 개의 배열로 grep하는 것보다 훨씬 간단했다. 그런 다음 단일 인덱스 (btw, perl 정규식에 익숙해졌으며 grep이 사용하는 것)를 사용하도록했다. 이 일을 더 간단하게 할 수 있습니까?

a_Array=$(curl --silent -L $xml | grep -oP '(?<=<a>).*?(?=</a>)') 
b_Array=$(curl --silent -L $xml | grep -oP '(?<=<b>).*?(?=</b>)') 
+0

'xml_grep'을 사용해 보셨나요? – esauvisky

+0

코드 구조를 변경할지 여부는 확실하지 않지만 그러한 도구는 알고 있습니까? – shookees

+0

절대로, 당신의 문제를 오해했습니다. 그것은 꽤 이상한 xml btw입니다. 코드에 어떤 문제가 있습니까? – esauvisky

답변

1

XML을 셸 수단으로 올바르게 구문 분석 할 수 없습니다. 이 주제에 대해 very nice text이 있습니다.

그렇다면 예외가있을 수 있습니다. 귀하의 의견은 임의의 XML하지만 특정 형식의 XML이 아닌 경우 하나를 들어, grep이 예에서

나는 결코 요소 <a>...</a><b>...</b> 각을 생각하지 속성, 각이 등을 사용하여 분석 할 수있을 것 비어있을 때 <a/>으로 절대로 축약되지 않으며, 각 행은 정확히 한 행에 걸쳐 있고 항상 서로를 따릅니다. 또한 우리는 어떤 [CDATA[...]] 또는 유사한 물건이 차례대로 귀하의 요소처럼 보이는 귀하의 XML에 나타날 것이라고 추측 할 수 있다고 생각합니다. 마지막으로, 우리는 입력에 공백이 없다고 가정합니다 (sth는 < a >과 같습니다).

이 모든 경우에는 grep을 '^<a>''^<b>'으로 설정할 수 있습니다. 예. 당신은 또한에 예를 들어, grep 's의 옵션 -A-B 유용을 찾을 수 있습니다

cat my.xml | grep -A 1 '^<a>' 

이것은 <a>로 시작하는 모든 라인과 같은 라인 다음 각 행을 인쇄합니다. -B은 regexp와 일치하는 행 앞에 행을 포함시키는 데 사용될 수 있습니다.

관련 문제