免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: letunix
打印 上一主题 下一主题

[文本处理] 如何通过 sed 来判断节点, 并删除节点根? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2013-03-09 16:53 |只看该作者
本帖最后由 letunix 于 2013-03-09 16:54 编辑

回复 25# yestreenstars


    找出原因了,
完整树是:
<dict>
    <array>

        <dict>
        </dict>
        .........
        <dict>
        </dict>

    </array>
</dict>

红色部分就是我刚刚所发的,
你的运行结果是没错, 就是多了一层父级 dict 给搞的, 然后运行结果为空...

论坛徽章:
0
32 [报告]
发表于 2013-03-09 16:55 |只看该作者
回复 30# cao627


    原因是找到了, 不会解决. 唉....

论坛徽章:
0
33 [报告]
发表于 2013-03-09 17:09 |只看该作者
本帖最后由 letunix 于 2013-03-09 17:18 编辑

回复 25# yestreenstars


    对不起, 我发个完整的 xml 树给你看看..

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
        <dict>
                <array>
                        <dict>
                                <key>abc</key>
                                <string>xxx</string>
                        </dict>


                        <dict>
                                <key>abc</key>
                                <string>xxx</string>
                                <dict>
                                        <string>eee</string>
                                </dict>
                        </dict>


                        <dict>
                                <key>abc</key>
                                <string>xxx</string>
                                <array>
                                        <string>eee</string>
                                </array>
                        </dict>


                        <dict>
                                <key>abc</key>
                                <string>ccc</string>
                                <array>
                                        <string>eee</string>
                                </array>
                        </dict>

                        <dict>
                                <key>abc</key>
                                <string>ccc</string>
                        </dict>
                </array>
        </dict>
</plist>
判断黄色, 删除红色..

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
34 [报告]
发表于 2013-03-09 17:22 |只看该作者
本帖最后由 yestreenstars 于 2013-03-09 17:23 编辑

回复 33# letunix


    你真够坑爹的啊~前面空白部分是\t组成的还是空格组成的?要删除的dict节点是不是前面都有三个\t?

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
35 [报告]
发表于 2013-03-09 17:30 |只看该作者
                        <dict>
                                <key>abc</key>
                                <string>eee</string>
                                <dict>
                                        <string>xxx</string>
                                </dict>

                        </dict>
这种情况是删除红色部分还是全部?

论坛徽章:
0
36 [报告]
发表于 2013-03-09 17:33 |只看该作者
本帖最后由 letunix 于 2013-03-09 17:33 编辑

回复 35# yestreenstars


    正常, 以我刚刚这种树形状, 是不存在这情况, 最好有两种方案, 一个是删除根节点, 另外就是只删除那个 dict, 文件复杂, 可能要用到.
麻烦你了...

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
        <dict>
                <array>
                        <dict>
                                <key>abc</key>
                                <string>xxx</string>
                        </dict>

                        <dict>
                                <key>abc</key>
                                <string>xxx</string>
                                <dict>
                                        <string>eee</string>
                                </dict>
                        </dict>

                        <dict>
                                <key>abc</key>
                                <string>xxx</string>
                                <array>
                                        <string>eee</string>
                                </array>
                        </dict>

                        <dict>
                                <key>abc</key>
                                <string>ccc</string>
                                <array>
                                        <string>eee</string>
                                </array>
                        </dict>

                        <dict>
                                <key>abc</key>
                                <string>ccc</string>
                        </dict>
                </array>
        </dict>
</plist>



输出的结果是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
        <dict>
                <array>

                        <dict>
                                <key>abc</key>
                                <string>ccc</string>
                                <array>
                                        <string>eee</string>
                                </array>
                        </dict>

                        <dict>
                                <key>abc</key>
                                <string>ccc</string>
                        </dict>
                </array>
        </dict>
</plist>

论坛徽章:
0
37 [报告]
发表于 2013-03-09 17:35 |只看该作者
回复 35# yestreenstars


    总共是有三层 dict, 第一层为根, 不动, 第二层就是我们要删除的, 第三层就是你刚刚说的情况..
    正常情况下, 第三层, 的 string, 不会与第二层的其中一个 string 产生同名..

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
38 [报告]
发表于 2013-03-09 18:00 |只看该作者
本帖最后由 yestreenstars 于 2013-03-09 18:08 编辑

有点小问题,修改一下~

论坛徽章:
0
39 [报告]
发表于 2013-03-09 18:13 |只看该作者
回复 38# yestreenstars


    嗯, 其实你不用考虑第三层 dict, 它只是一种可能, 多数第三层还是 <array></array>

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
40 [报告]
发表于 2013-03-09 18:23 |只看该作者
1.如果你的分隔符是"\t",那就用下面的脚本:
  1. sed -r '/^\t{3}<dict>$/{:1;N;/<dict>$/{:2;N;/<\/dict>/!b2;b1};/\n$/!b1;/<string>xxx<\/string>/d}'
复制代码
2.如果你的分隔符是" ",那就用下面的脚本:
  1. sed -r '/^ {24}<dict>$/{:1;N;/<dict>$/{:2;N;/<\/dict>/!b2;b1};/\n$/!b1;/<string>xxx<\/string>/d}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP