免费注册 查看新帖 |

Chinaunix

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

[学习共享] sed 多行匹配,删除多行,误删除问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-15 11:21 |只看该作者 |倒序浏览
本帖最后由 zealveryme 于 2012-10-18 15:49 编辑

以前写了一个过滤日志的程序,最近发现有个BUG,用sed的/A/,/B/d,删除含A字符串的到含B字符串的行,如果只有A的话就变成了删除含字符串A以后的所有行了,不知道怎么处理,请大家帮忙看看,是个看似很简单的问题,我自己弄了一个例子测试,当然这不是我想要的结果,怎么能避免多行匹配时的误删除,关键这个问题我搜不到答案。所以这能来这里问问大家了。还有一个要求是 A和B之间必须有3行任意内容,就是说如果A在地3行那么B要是不在地7行也不删除。
  1. cat aaa
  2. #!/usr/bin/sed -f
  3. /333/,/777/d

  4. cat bbb
  5. vvv 111 vvv
  6. vvv 222 vvv
  7. vvv 333 vvv
  8. vvv 444 vvv
  9. vvv 555 vvv
  10. vvv 999 vvv

  11. aaa bbb
  12. vvv 111 vvv
  13. vvv 222 vvv
复制代码
补充一个问题:用sed+正则表达式,不能完成吗?

论坛徽章:
0
2 [报告]
发表于 2012-10-15 15:28 |只看该作者
  1. #!/bin/sh
  2. filepath=/home/creat/
  3. file=aaa
  4. start_string=333
  5. end_string=777

  6. cd filepath
  7.   test=`cat aaa|grep $start_string`
  8.   if [ -n "$test" ];then
  9.     start_array=(`sed "/${start_string}/=" -n $file`)
  10.     start=${start_array[@]:0:1}
  11.   else
  12.     start=`sed -n '$=' $file`
  13.   fi
  14.   test=`cat aaa|grep $start_string`
  15.   if [ -n "$test" ];then
  16.     end_array=(`sed "/${end_string}/=" -n $file`)
  17.     end=${end_array[${#end_array[*]}-1]}
  18.   else
  19.     end=`sed -n '$=' $file`
  20.   fi
  21. line=`sed -n '$=' $file`
  22. echo $start
  23. echo $end
  24. echo $line
  25. if [ $start -eq $line ];then
  26.   exit 1
  27. elif [ $start -eq $end ];then
  28.   exit 2
  29. elif [ $end -lt $start ];then
  30.   exit 3
  31. elif [ $end -lt $line ];then
  32.   if [ $start -lt $end ];then
  33.     sed -i "/${start_string}/,/${end_string}/d" $file
  34.   fi
  35. elif [ $end -eq $line ];then
  36.   test=`sed -n "${line}p" $file|grep $end_string|awk '{print $1}'`
  37.   if [ -n "$test" ];then
  38.   echo $test
  39.     sed -i "/${start_string}/,/${end_string}/d" $file
  40.     exit 4
  41.   fi
  42. else
  43.   exit 5
  44. fi
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2012-10-15 16:20 |只看该作者
回复 1# zealveryme
  1. cat aaa
  2. vvv 111 vvv
  3. vvv 222 vvv
  4. vvv 333 vvv
  5. vvv 444 vvv
  6. vvv 555 vvv
  7. vvv 666 vvv
  8. vvv 777 vvv
  9. vvv 888 vvv
  10. vvv 999 vvv

  11. sed -n  '/333/{h;n;H;n;H;n;H;n;H;/777/ba;g;bc;:a d};:c p' aaa
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-10-15 16:25 |只看该作者
  1. #!/bin/sh
  2. filepath=/home/creat/
  3. file=aaa
  4. start_string=333
  5. end_string=777
  6. cd /home/creat/
  7. test=`cat $file|grep $start_string|awk '{print $1}'`
  8. if [ -n "$test" ];then
  9.   num=`sed -n "/${start_string}/=" $file|wc -l`
  10.   while [ $num -gt 0 ]
  11.   do
  12.     ((num--));
  13.     start=`sed "/${start_string}/q" $file|sed -n "$="`
  14.     end=`expr $start + 4`
  15.     test=`cat $file|sed -n "${end}p"|grep $end_string|awk '{print $1}'`
  16.     if [ -n "$test" ];then
  17.       sed -i "${start},${end}d" $file
  18.     fi
  19.   done
  20. fi
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-10-18 15:49 |只看该作者
用sed+正则表达式,不能完成吗?

论坛徽章:
0
6 [报告]
发表于 2012-10-18 15:53 |只看该作者
本帖最后由 zealveryme 于 2012-10-18 15:55 编辑
greysky-zfj 发表于 2012-10-15 16:20
回复 1# zealveryme0112.sed -n  '/333/{h;n;H;n;H;n;H;n;H;/777/ba;g;bc;:a d};:c p' aaa
复制代码
能解释一下吗?并且我没执行成功!!

论坛徽章:
0
7 [报告]
发表于 2012-10-18 16:08 |只看该作者
已经觉得sed+正则无法完成任务了,好吧,cao_doctor 的第二种方法真心不错。放弃sed了

论坛徽章:
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
8 [报告]
发表于 2012-10-18 17:12 |只看该作者
还好只是要求间隔3行有数据,如果要多的真不知怎么写了。
  1. sed '/333/{N;/777/{d;b};N;/777/{d;b};N;/777/{d;b};N;/777/b;:1;N;/777/{d;b};b1}' urfile
复制代码

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
9 [报告]
发表于 2012-10-18 19:13 |只看该作者
  1. sed '/333/{:a;N;/777/!ba;/\(\n[^\n]*\)\{4\}/d}' urfile
复制代码

论坛徽章:
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
10 [报告]
发表于 2012-10-18 20:23 |只看该作者
本帖最后由 yestreenstars 于 2012-10-18 20:24 编辑

回复 9# winway1988


对于777不在333后1、2、3行的这种情况,你的就无效了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP