免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2009 | 回复: 8
打印 上一主题 下一主题

[文本处理] 使用shell脚本根据父子节点修改xml文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-16 13:49 |只看该作者 |倒序浏览
现在有如下xml文件,想使用shell脚本进行修改,请问该如何修改。

<aaa>
    <AAA>
        <bbb>
             <ccc>Other text</ccc>
         </bbb>
        <ddd>
            <ccc>Modify text(这里是我想要修改的内容)</ccc>
        </ddd>
    </AAA>
    <BBB>
        <bbb>
             <ccc>Other text</ccc>
         </bbb>
        <ddd>
            <ccc>Other text</ccc>
        </ddd>
    <BBB>
</aaa>

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
2 [报告]
发表于 2016-08-16 14:12 |只看该作者
本帖最后由 moperyblue 于 2016-08-16 15:13 编辑
  1. sed -r '/<AAA>/{:a;/<\/AAA>/!{N;ba};s/(<ddd>.*<ccc>)[^<]*/\1ok/}' file
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2016-08-16 14:59 |只看该作者
回复 1# 哥哥_88

$ awk 'BEGIN{RS="<";FS=OFS=">"}function get_tag(){s=$1;d=sub("^/","",s)?-1:1;if(NF>1){c+=d;if(d>0)t[c]=s}s="";for(n=1;n<=c;++n)s=s"/"t[n];return(s)}{tag=get_tag();if(tag=="/aaa/AAA/ddd/ccc")$2="xxxx";printf $0RT}' xml
<aaa>
    <AAA>
        <bbb>
             <ccc>Other text</ccc>
         </bbb>
        <ddd>
            <ccc>xxxx</ccc>
        </ddd>
    </AAA>
    <BBB>
        <bbb>
             <ccc>Other text</ccc>
         </bbb>
        <ddd>
            <ccc>Other text</ccc>
        </ddd>
    <BBB>
</aaa>

   

论坛徽章:
0
4 [报告]
发表于 2016-08-16 16:11 |只看该作者
回复 3# jason680


    大神,太厉害了,上一个问题也是你用perl脚本帮忙搞定,对你除了崇拜就只剩景仰了。

论坛徽章:
0
5 [报告]
发表于 2016-08-16 16:33 |只看该作者
回复 3# jason680


    awk还是有这个问题:
        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <awk: (FILENAME=server.xml FNR=54) fatal: not enough arguments to satisfy format string
        `Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      <'
                                                                                                                                                                                  ^ ran out for this one

去网上查了,说是因为%的关系,论坛之前有人回复为“awk '{printf "%s", something}'”,可是不知道在这个语句中怎么修改。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2016-08-16 22:56 |只看该作者
本帖最后由 jason680 于 2016-08-16 22:57 编辑

回复 5# 哥哥_88

add some note in xml file

$ awk 'BEGIN{RS="<";FS=OFS=">"}function get_tag(){if($1~/^!--/)return(r);s=$1;d=sub("^/","",s)?-1:1;if(NF>1){c+=d;if(d>0)t[c]=s}r="";for(n=1;n<=c;++n)r=r"/"t[n];return(r)}{tag=get_tag();if(tag=="/aaa/AAA/ddd/ccc")$2="xxxx";printf "%s",$0RT}' xml
<aaa>
    <AAA>
    <!-- note1
       note2 ... -->

        <bbb>
             <ccc>Other text</ccc>
         </bbb>
        <ddd>
            <ccc>xxxx</ccc>
        </ddd>
    </AAA>
    <BBB>
        <bbb>
             <ccc>Other text</ccc>
         </bbb>
        <ddd>
            <ccc>Other text</ccc>
        </ddd>
    <BBB>
</aaa>

   

论坛徽章:
0
7 [报告]
发表于 2016-08-17 09:37 |只看该作者
回复 6# jason680


    感谢,%的问题已经解决,但是我的如下文件没修改成功,不知道是什么原因:

awk 'BEGIN{RS="<"}function get_tag(){s=$1;d=sub("^/","",s)?-1:1;if(NF>1){c+=d;if(d>0)t[c]=s}s="";for(n=1;n<=c;++n)s=s"/"t[n];return(s)}{tag=get_tag();if(tag=="/config/interface/system1/reqsystem/address")$2="xxxx";printf "%s",$0RT}' test.xml > tmp

<?xml version="1.0" encoding="utf-8"?>
<config>
        <interface>
                <!-- Security Center -->
                <system1>
                        <reqsystem>
                                <address>127.0.0.1</address>
                                <account>test</account>
                                <password>test</password>

                        </reqsystem>
                        <JK0001>
                                <api>myApiName1
                                </api>
                                <method>POST</method>
                                <desc>Test Interface</desc>
                        </JK0001>
                        <JK0002>
                                <api>myApiName2</api>
                                <method>POST</method>
                                <desc>Test Interface</desc>
                        </JK0002>
                </system1>

                <system2>
                        <reqsystem>
                                <address>127.0.0.1</address>
                                <account>test</account>
                                <password>test</password>

                        </reqsystem>
                        <JK0001>
                                <api>myApiName1
                                </api>
                                <method>POST</method>
                                <desc>Test Interface</desc>
                        </JK0001>
                        <JK0002>
                                <api>myApiName2</api>
                                <method>POST</method>
                                <desc>Test Interface</desc>
                        </JK0002>
                </system2>
        </interface>

        <sysServiceParams>
                <info>
                        <count>10</count>
                </info>
                <setting>
                        <about>About</about>
                </setting>
        </sysServiceParams>

</config>

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2016-08-17 12:39 |只看该作者
回复 7# 哥哥_88

$ awk 'BEGIN{RS="<";FS=OFS=">"}function get_tag(){if($1~/^[^\/a-zA-Z0-9]/)return("");s=$1;d=sub("^/","",s)?-1:1;if(NF>1){c+=d;if(d>0)t[c]=s}r="";for(n=1;n<=c;++n)r=r"/"t[n];return(r)}{tag=get_tag();if(tag=="/config/interface/system1/reqsystem/address")$2="192.168.1.1";printf "%s",$0RT}' test.xml > tmp.xml


$ diff test.xml tmp.xml
7c7
<                                 <address>127.0.0.1</address>
---
>                                 <address>192.168.1.1</address>

   

论坛徽章:
0
9 [报告]
发表于 2016-08-17 14:29 |只看该作者
回复 8# jason680


    看到改动点了,虽然看不大懂,但是问题完美解决了,非常感谢!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP