我的輸入XML如下。如果存在「SEARCH」關鍵字,我需要在輸入XML中進行搜索。如果存在,我需要 將<record>
的內容複製到</record>
並寫入另一個XML文件。awk:在XML中搜索關鍵字並寫入其他文件
輸入XML
<XML>
<record category="xyz">
<person ssn="" e-i="E">
<title xsi:nil="true"/>
<position xsi:nil="true"/>
<details>
<names>
<first_name/>
<last_name></last_name>
</names>
<aliases>
<alias>CDP</alias>
</aliases>
<keywords>
<keyword xsi:nil="true"/>
<keyword>SEARCH</keyword>
</keywords>
<external_sources>
<uri>http://www.google.com</uri>
<detail>SEARCH is present in abc for xyz reason</detail>
</external_sources>
</details>
</person>
</record>
<record category="abc">
<person ssn="" e-i="F">
<title xsi:nil="true"/>
<position xsi:nil="true"/>
<details>
<names>
<first_name/>
<last_name></last_name>
</names>
<aliases>
<alias>CDP</alias>
</aliases>
<keywords>
<keyword xsi:nil="true"/>
<keyword>DONTSEARCH</keyword>
</keywords>
<external_sources>
<uri>http://www.google.com</uri>
<detail>SEARCH is not present in abc for xyz reason</detail>
</external_sources>
</details>
</person>
</record>
</XML>
我的本次代碼:與當前代碼
NR==FNR {
keywordArray[NR]=$0;
next;
}
/<record/{ i=1 }
i { a[i++]=$0 }
/<\/record>/ {
if (found) {
for (i=1; i<=length(a); ++i) print a[i] >> output.xml
}
i=0;
found=0
}
$0 ~ "<keyword>"SEARCH"</keyword>" { found=1 }
問題:
代碼不搜索 「搜索」,它不寫任何東西到output.xml
預期輸出:
<record category="xyz">
<person ssn="" e-i="E">
<title xsi:nil="true"/>
<position xsi:nil="true"/>
<details>
<names>
<first_name/>
<last_name></last_name>
</names>
<aliases>
<alias>CDP</alias>
</aliases>
<keywords>
<keyword xsi:nil="true"/>
<keyword>SEARCH</keyword>
</keywords>
<external_sources>
<uri>http://www.google.com</uri>
<detail>SEARCH is present in abc for xyz reason</detail>
</external_sources>
</details>
</person>
</record>
股票建議:不要使用像awk這樣的面向行的工具來操作XML數據。改爲使用支持XML的工具,如「xsltproc」和「xmlstarlet」。 –
ie xmlstarlet sel -t -m'XML/record/person/details/keywords/keyword [。=「SEARCH」]'-c'../../../...'foo.xml> bar.xml – tomc
@tomc:爲什麼在上面的代碼中需要''../../../ ..''? – user2488578