一种获取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 ' ' '
' | sort -nr | sed -n '/'"$name_num"'/,+1p' | tail -n 1)
end_num=$(echo "$num_list" | tr ' ' '
' | 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 '' ' ' 获得多行文本,便于排序

评价

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

原文地址:https://www.cnblogs.com/Peter2014/p/10139172.html