Ksh

如何使用 ksh 腳本將通用 xml 格式塊從 xml 文件轉換為屬性格式字元串

  • June 24, 2015

有條件:

  1. 我沒有權限,無法使用任何 XML 解析器工具,只讀
  2. 我的 xmllint 版本不支持 xpath,無法更新,只讀
  3. 我沒有 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

引用自:https://unix.stackexchange.com/questions/211884