免费注册 查看新帖 |

Chinaunix

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

[文本处理] 请教一个sed对于innser regex的匹配问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-31 15:57 |只看该作者 |倒序浏览
本帖最后由 jyf1987 于 2013-05-31 15:59 编辑

hi, 我在gnu sed的手册上看到一段

\(regexp\)
    Groups the inner regexp as a whole, this is used to:

        Apply postfix operators, like \(abcd\)*: this will search for zero or more whole sequences of ‘abcd’, while abcd* would search for ‘abc’ followed by zero or more occurrences of ‘d’. Note that support for \(abcd\)* is required by POSIX 1003.1-2001, but many non-GNU implementations do not support it and hence it is not universally portable.
        Use back references (see below).


所以就尝试在工作中使用这一特性

实际案例是 解析apachelog 从中提取特定统计uri的访问 我们有一个营销活动其有两种参与状态 是否参与与uri 的paramaters里是否有某个字段(multi_ads)有关 也就是说 有multi_ads=xx 这样的即位参与状态A 没有的即为参与状态B

实际使用sed来匹配的时候 发现 使用那个 \(regex\)* 并不能被 back references引用到

空口无凭,上演示
  1. (
  2.     echo "blahblah&a=1&aa=1&b=2&ee=1&c=3&d=4"
  3.     echo "blahblah&a=2&aa=1&b=1&ee=1&c=3&d=4"
  4.     echo "blahblah&a=3&aa=1&b=2&ee=1&c=3&d=4"
  5.     echo "blahblah&a=4&aa=1&b=1&ee=1&c=3&d=4"
  6.     echo "blahblah&a=5&aa=1&b=2&ee=1&c=3&d=4"
  7.     echo "blahblah&a=6&aa=1&b=1&ee=1&d=4"
  8.     echo "blahblah&a=7&aa=1&b=2&ee=1&c=3&d=4"
  9. ) | sed -n 's/^.\+a\=\([0-9]\+\).\+b\=1.*&\(c\=[0-9]\)\?.\+/\1 \2/p'
复制代码
奇怪的是 这种代码就可以
  1. (     echo "a=1&b=2&c=3&d=4";     echo "a=3&b=2&c=3&d=4";     echo "a=3&b=2&d=4";     echo "a=1&b=4&c=3&d=4";     echo "a=1&b=2&d=4"; ) | sed -n 's/^a\=\([0-9]\+\).\+b\=2&\(c\=3\)\?.\+/\1 \2/p'
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
2 [报告]
发表于 2013-05-31 16:29 |只看该作者
\1 不是一个数字么? 我执行结果

1 c=3
3 c=3
3
1

论坛徽章:
0
3 [报告]
发表于 2013-05-31 17:06 |只看该作者
你这个是第2段执行的吧 这个确实没问题

但是第一段执行不会打印出 c=3的情况 虽然他们所在的行已经被匹配了


回复 2# wenhq


   

论坛徽章:
0
4 [报告]
发表于 2013-05-31 17:31 |只看该作者
自己解决了 额
  1. (
  2.     echo "blahblah&a=1&b=2&ee=1&c=3&d=4"
  3.     echo "blahblah&a=2&b=1&ee=1&c=3&d=4"
  4.     echo "blahblah&a=3&b=2&ee=1&c=3&d=4"
  5.     echo "blahblah&a=4&b=1&ee=1&c=3&d=4"
  6.     echo "blahblah&a=5&b=2&ee=1&c=3&d=4"
  7.     echo "blahblah&a=6&b=1&ee=1&d=4"
  8.     echo "blahblah&a=7&b=2&ee=1&c=3&d=4"
  9. ) | sed -n -e '/b=1/!d; s/^.+a=([0-9]+)(.+)/1 2/; s/([^&]+)&.+(c=[0-9]+).+/1 2/; s/([^&]+)&.+/1 NOC/; p'
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
5 [报告]
发表于 2013-05-31 18:01 |只看该作者
回复 4# jyf1987


    这么厉害,这不用\转义的(和),不得是在 sed -r 里使用么,没研究过。。

论坛徽章:
0
6 [报告]
发表于 2013-06-03 13:25 |只看该作者
可能是被转义了吧

我sed只是学了个皮毛而已

回复 5# seesea2517


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP