免费注册 查看新帖 |

Chinaunix

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

学会用sed写循环处理了:) [复制链接]

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-17 22:50 |只看该作者 |倒序浏览
对sed的使用一直紧限于 s//; //s///;  //,//s/// 稍复杂一点就用awk,可是有时候awk写起来也太长了

最近碰到一个处理跨行xml节点的问题,终于激发了进一步学习sed的愿望,并学会了使用b label写循环

<tag id="0" attr2 = "val2" attr3 = "val3" attr4 = "val4" />
<tag id="1" attr2 = "val2"
        attr3 = "val3"
        attr4 = "val4"/>

替换指定xml节点中的attr4属性名
sed -e ‘/<tag id="‘$id’"/ { :loop />/! {N; b loop}; s/attr4/ak47/ }’ test.xml

论坛徽章:
0
2 [报告]
发表于 2009-07-17 22:56 |只看该作者

回复 #1 yjh777 的帖子

我学习来了,

论坛徽章:
0
3 [报告]
发表于 2009-07-18 00:09 |只看该作者
学习了

论坛徽章:
0
4 [报告]
发表于 2009-07-18 08:50 |只看该作者

回复 #1 yjh777 的帖子

谁来解释一下?俺还在h;H;g;G;n;a;x;p里爬模滚打呢

论坛徽章:
0
5 [报告]
发表于 2009-07-18 10:56 |只看该作者

回复 #4 lucash 的帖子

sed -e ‘/<tag id="‘$id’"/ { :loop />/! {N; b loop}; s/attr4/ak47/ }’ test.xml

比如id="0"
当适配id="0"时开始进入{ :loop />/! {N; b loop}
:loop 是定义一个标签名为loop  这个标签脚本为 />/! {N; b loop}
/>/! 意思是当不适配>时执行{N; b loop}
N; 是增加下一行到模板直到遇到>为止 否则一直循环下去 然后把attr4替换为ak47

一般添加标签作为循环 主要是解决跨行问题。

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
6 [报告]
发表于 2009-07-18 13:51 |只看该作者
原帖由 lucash 于 2009-7-18 08:50 发表
谁来解释一下?俺还在h;H;g;G;n;a;x;p里爬模滚打呢


排版一下
/<tag id="0"/ {
    :loop
    />/! {
        N;
        b loop
    };
    s/attr4/ak47/
}

C风格的伪代码
if match('<tag id="0"') {
    loop:
    if not match('>') {
        appent next line to pattern space
        goto loop
    }
    substitute first 'attr4' with 'ak47'
}

[ 本帖最后由 yjh777 于 2009-7-18 13:53 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
7 [报告]
发表于 2009-07-18 15:30 |只看该作者
学习学习!

论坛徽章:
0
8 [报告]
发表于 2009-07-19 15:36 |只看该作者
学习

论坛徽章:
0
9 [报告]
发表于 2009-07-19 23:56 |只看该作者
good good study!

论坛徽章:
0
10 [报告]
发表于 2009-07-20 09:19 |只看该作者
原帖由 yjh777 于 2009-7-18 13:51 发表


排版一下
//! {
        N;
        b loop
    };
    s/attr4/ak47/
}

C风格的伪代码
if match('') {
        appent next line to pattern space
        goto loop
    }
    substitute ...


这样写看得更清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP