나는 다음과 같은 긴 줄을 가지고 있습니다:
<hdr><name><first>John</first><mid></mid><last>Smith</last></name><dob>04181995</dob><phone>5550001111<phone></hdr>
다음 콘텐츠를 어떻게 추출할 수 있나요?
<first>John</first>
<mid></mid>
<last>Smith</last>
<dob>04181995</dob>
<phone>5550001111<phone>
sed를 시도했지만 추가 태그가 있습니다.
echo "<hdr><name><first>John</first><mid></mid><last>Smith</last></name><dob>04181995</dob><phone>5550001111<phone></hdr>" | sed -e 's/></>\n</g'
<hdr>
<name>
<first>John</first>
<mid>
</mid>
<last>Smith</last>
</name>
<dob>04181995</dob>
<phone>5550001111<phone>
</hdr>
아마도 grep이 그것을 할 수 있을 것이다. 나는 그것을 알아낼 수 없다. 도와주세요
답변1
XML 파서(예: xmllint
XPath)를 사용하여 필요한 노드를 탐색하고 선택하려고 합니다.
echo "<hdr><name><first>John</first><mid></mid><last>Smith</last></name><dob>04181995</dob><phone>5550001111</phone></hdr>" \
| xmllint --xpath 'hdr/name/* | hdr/dob | hdr/phone' -
답변2
XML 파서 사용 xmlstarlet
(깨진 phone
닫는 태그 수정 후):
$ xmlstarlet sel -t -m '/hdr' -c 'name/*' -c dob -c phone -nl file.xml
<first>John</first><mid/><last>Smith</last><dob>04181995</dob><phone>5550001111</phone>
먼저 /hdr
노드를 일치시킨 다음 계속해서 노드( ) , 즉 , 하위 -c
노드의 각 하위 노드의 복사본을 선택합니다 . 그런 다음 노드의 복사본도 추출합니다 .name
first
mid
last
dob
phone