私は次のような長い行を持っています:
<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