配置文件
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"
几点说明
- sed引用变量需要'"$var"'
- echo "$var" 才能换行
- sed只能//,+1获取下一行,不能获取上一行
- tr '' ' ' 获得多行文本,便于排序
评价
有点呆的方法,一定有更好的。