美文网首页
Sed修改XML

Sed修改XML

作者: mtinsky | 来源:发表于2022-04-11 11:33 被阅读0次

    Sed修改XML

    前言

    有些框架的配置文件为XML格式,如果需要通过Shell修改配置项的值,可以借助一些工具例如Sed进行修改,下面举例子进行说明修改的思路,其他的XML格式可以参考进行匹配修改

    例子:HDFS的配置文件hdfs-site.xml的配置dfs.datanode.data.dir的值

    需要将/dataA改为为/dataB

    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/dataA</value>
        <description>Determines where on the local filesystem an DFS data node
            should store its blocks.  If this is a comma-delimited
            list of directories, then data will be stored in all named
            directories, typically on different devices.
            Directories that do not exist are ignored.
        </description>
    </property>
    

    命令

    dfs_datanode_data_dir=/dataB
    hdfs_site_xml_dir=hdfs-site.xml的路径
    # 获取<name>dfs.datanode.data.dir</name>的行号
    beginline=`sed -n '/<name>dfs.datanode.data.dir<\/name>/=' $hdfs_site_xml_dir`
    # 获取<name>dfs.datanode.data.dir</name>的行号下遇到的第一个<value>的行号
    endline=`sed -n "$beginline,/value/=" $hdfs_site_xml_dir |tail -n 1`
    # 获取第beginline行到第endline行之间符合<value>.*<value>的行,并进行替换
    sed -r -i "$beginline,${endline} s#(<value>).*(<\/value>)#\1$dfs_datanode_data_dir\2#1" $hdfs_site_xml_dir
    

    解析:

    #-n 不打印文本里内容,'/查找的内容/='输出包含要"查找的内容"的行号,两者结合可以做到只输出包含要"查找的内容"的行号
    sed -n '/查找的内容/=' 文件地址:
    #查找第$beginline行至包含'查找的内容'之间的内容,输出行号(=的作用),结合tail做到例子中获取value的行号
    sed -n "$beginline,/查找的内容/=" $hdfs_site_xml_dir
    #取最后一行
    tail -n 1 
    #-r 编辑文件 -i 使用扩展的正则表达式
    # $beginline,${endline} 处理第$beginline到${endline}行的内容
    # s#(<value>).*(<\/value>)#\1$dfs_datanode_data_dir\2#1
    # 将\1$dfs_datanode_data_dir\2替换(<value>).*(<\/value>)
    #/1指第一个括号内的<value>,第二个\1指第二个括号内的<\/value>
    # 此处分隔符是#而不是/是为了解决当value值为路径时包含大量/冲突的问题
    sed -r -i "$beginline,${endline} s#(<value>).*(<\/value>)#\1$dfs_datanode_data_dir\2#1" 
    

    参考
    linux:sed修改xml中的值示例
    SED 简明教程

    相关文章

      网友评论

          本文标题:Sed修改XML

          本文链接:https://www.haomeiwen.com/subject/nxyisrtx.html