Chinaunix

标题: 请教一个sed对于innser regex的匹配问题 [打印本页]

作者: jyf1987    时间: 2013-05-31 15:57
标题: 请教一个sed对于innser regex的匹配问题
本帖最后由 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'
复制代码

作者: wenhq    时间: 2013-05-31 16:29
\1 不是一个数字么? 我执行结果

1 c=3
3 c=3
3
1
作者: jyf1987    时间: 2013-05-31 17:06
你这个是第2段执行的吧 这个确实没问题

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


回复 2# wenhq


   
作者: jyf1987    时间: 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'
复制代码

作者: seesea2517    时间: 2013-05-31 18:01
回复 4# jyf1987


    这么厉害,这不用\转义的(和),不得是在 sed -r 里使用么,没研究过。。
作者: jyf1987    时间: 2013-06-03 13:25
可能是被转义了吧

我sed只是学了个皮毛而已

回复 5# seesea2517


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2