1. 程式人生 > >一種獲取xml檔案某個節點內容的shell方法

一種獲取xml檔案某個節點內容的shell方法

配置檔案

config.xml

<xml>
<server>
    <name>srv-01</name>
</server>
<server>
    <name>srv-02</name>
</server>
</xml>

問題

如何獲取name為srv-01對應的server節點段落?

sed和awk的問題

sed和awk的正則表示式不支援非貪婪匹配

一種解決方法

  • 原理
  根據cat -n config.xml獲取行號,獲得<name>srv-01</name>行號、<server>行號、</server>行號,距離name行號最近的兩個server行號即為目標內容的開始和結束。
  • 程式碼
name_num=$(cat -n config.xml | sed -n '/<name>srv-01<\/name>/p' | awk '{print $1}')
start_num=$(cat -n config.xml | sed -n '/<server>/p' | awk '{print $1}')
end_num=$(cat -n config.xml | sed -n '/<\/server>/p' | awk '{print $1}')
num_list="$start_num $name_num $end_num"
start_num=$(echo "$num_list" | tr ' ' '\n' | sort -nr | sed -n '/'"$name_num"'/,+1p' | tail -n 1)
end_num=$(echo "$num_list" | tr ' ' '\n' | sort -n | sed -n '/'"$name_num"'/,+1p' | tail -n 1)
server_content=$(sed -n ''"$start_num"','"$end_num"'p' config.xml)
echo "$server_content"

幾點說明

  1. sed引用變數需要'"$var"'
  2. echo "$var" 才能換行
  3. sed只能//,+1獲取下一行,不能獲取上一行
  4. tr '' '\n' 獲得多行文字,便於排序

評價

有點呆的方法,一定有更好的。