Ksh
如何使用 ksh 腳本將通用 xml 格式塊從 xml 文件轉換為屬性格式字元串
有條件:
- 我沒有權限,無法使用任何 XML 解析器工具,只讀
- 我的 xmllint 版本不支持 xpath,無法更新,只讀
- 我沒有 xmlstarlet,無法安裝
我的選擇僅限於幾乎字元串處理。
使用者將提供一個輸入參數,它將是塊的名稱。
所以,
讓我們假設
NAME=${USER_INPUT}
我們將
$NAME
用作參數來搜尋將要搜尋的 xml 塊。如何在這樣的 xml 文件中轉換這樣的通用 xml 塊:
<block> <name>Bob</name> <address>USA</address> <email>bob@dogs.com</email> <phone>1234567</phone> </block> <block> <name>Peter</name> <food>France</address> <cell>peter@pizza.com</cell> <drinks>Coke</drinks> <car>Honda</car> <bike>Mountain bike</bike> </block>
所以我想在這裡實現的是獲得滿足我搜尋的 xml 塊,
例如
NAME=Bob
;腳本的輸出應該是屬性文件格式
name=Bob address=USA email=bob@dogs.com phone=1234567
這裡要考慮的一點是每個塊的 xml 格式是不同的。每個 xml 塊的節點都不相同。
Perl 有一個漂亮的“段落模式”(
-00
),其中記錄(“行”)由空行而不是單個\n
字元分隔。使用它,您可以非常輕鬆地提取相關記錄。因此,首先確保每個 之前有一個空行<block>
,然後使用段落模式查找您要搜尋的內容:$ sed 's/<block>/\n<block>/' file | perl -00ne 'if(/<name>\s*bob\s*<\/name>/i){print}' <block> <name>Bob</name> <address>USA</address> <email>bob@dogs.com</email> <phone>1234567</phone> </block>
現在,將其包裝在一個 shell 腳本中(在此處使用 bash):
#!/bin/ksh ## Read the search strings tag="$1" value="$2" target="file.xml" ## change this to whatever your xml file is called ## Search sed 's/<.\?block>/\n/' "$target" | perl -00ne "if(/<$tag>\s*$value\s*<\/$tag>/i){ ## May as well do the formatting in Perl as well s# *<([^/]+?)>#\1=#g; s/<\/.+?>//g; print }"
然後,執行將標籤名稱和所需值作為輸入的腳本:
$ a.sh "name" "bob" name=Bob address=USA email=bob@dogs.com phone=1234567