zoukankan      html  css  js  c++  java
  • 一种获取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 '' ' ' 获得多行文本,便于排序

    评价

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

  • 相关阅读:
    深入理解PHP原理之变量作用域
    深入理解PHP原理之变量分离/引用
    关于哈希表
    foreach 相关
    Scrapyd-Client的安装
    Scrapyd API的安装
    scrapyd的安装
    快手的小视频爬取
    实现单例模式的几种方式
    京东图书分布式爬虫
  • 原文地址:https://www.cnblogs.com/Peter2014/p/10139172.html
Copyright © 2011-2022 走看看