一種獲取xml檔案某個節點內容的shell方法
阿新 • • 發佈:2018-12-18
配置檔案
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"
幾點說明
- sed引用變數需要'"$var"'
- echo "$var" 才能換行
- sed只能//,+1獲取下一行,不能獲取上一行
- tr '' '\n' 獲得多行文字,便於排序
評價
有點呆的方法,一定有更好的。