免费注册 查看新帖 |

Chinaunix

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

sed实现grep的-A和-B参数?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-31 13:52 |只看该作者 |倒序浏览
grep -A n 'regexp'       //过滤匹配的行及之后的n行
grep -B n 'regexp'      //过滤匹配的行及之前的n行

cat file
1111
2222
3333
4444
5555
6666
7777
如果只是得到匹配行和前后的一行还好解决!
cat test |sed -n -e '/4444/{x;G;p}' -e 'h'         //得到匹配的行及之前的1行
cat test |sed -n '/4444/{N;p}'                        //得到匹配的行及之后的1行
cat test |sed -n -e '/4444/{x;G;N;p}' -e 'h'         //得到匹配的行、前1行和后1行

但是如果匹配前后的n行就头疼了!我想到的办法是用行号计算,而且只能匹配一次。
cat test | sed -n '/4444/='     
cat test | sed '='|sed 'N;s/\n/ /'|sed -n -e '/4444/{x;s/\n//;G;p}' -e '/^[2-3]/H' | sed 's/..//'
cat test | sed '='|sed 'N;s/\n/ /'|sed -n -e '/4444/{/\n/!h;N;H;s/\([^\n]\+\)\(\n.*\)/\1/;x;/\n6/{s/[^\n]\+\n//;p};/\n6/!D}' | sed 's/..//'
第一条命令得到匹配4444的行号为4,如果要获取前后两行,计算得到前面的二行行号[2-3],后面的二行行号[5-6]
第二条命令可以得到匹配4444的行和它前面的两行;
第三条命令可以行到匹配4444的行和它后面的两行;
如果要匹配N行,只需重新计算,替换行号范围。

如果哪位大侠有很有效率的方法并得到所有匹配的方法!!!!跪求!!!!!!!!!!!!!1

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2012-05-31 14:49 |只看该作者
之后的N行可以使用sed的地址计算。


       addr1,+N
              Will match addr1 and the N lines following addr1.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2012-05-31 14:50 |只看该作者
匹配之前的N行,就不好处理了。感觉把实际的数字带入sed,sed的处理能力是有限的。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2012-05-31 14:55 |只看该作者
  1. seq 10 |sed -rn 'x;
  2. s/^\n[^\n]*((\n[^\n]){3})$/\1/;
  3. /\n4$/{
  4.    x;
  5.   :a;
  6.    N;
  7.    /^([^\n]+\n){1}[^\n]+$/{
  8.        H;g;s/\n//p;b};
  9.    ba
  10. };
  11. x;H'
  12. 2
  13. 3
  14. 4
  15. 5
  16. 6
复制代码

论坛徽章:
0
5 [报告]
发表于 2012-06-01 18:18 |只看该作者
本帖最后由 lannuo2000 于 2012-06-01 18:23 编辑

4L的感觉好复杂

因为没仔细读过sed的man手册,结果走了不少弯路!
2L的用法正是我想要的,很容易得到匹配的后N行,关于匹配前N行,结合逆序,我想到了一个好的算法:
NUM=2                     //NUM为要匹配的行数                     
cat test |sed '1!G;h;/4444/{!d;q};d' | sed -n '1,$(($NUM+1))p'| sed '1!G;h;$!d'
sed '1!G;h;/4444/{!d;q};d          //逆序从第1行到匹配的行
sed -n '1,$(($NUM+1))p'             //得到匹配的行和前N行的逆序
sed '1!G;h;$!d'                         //再逆过来:wink:


sed -n '/4444/,+${NUM}p'       //得到匹配行和后N行

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
6 [报告]
发表于 2012-06-01 23:42 |只看该作者
  1. [winway@s211 ~]$ n=6
  2. [winway@s211 ~]$ seq 1 10 | sed -n ':a;/\n8$/{p;b};N;/\(.*\n\)\{'"$n"'\}/!ba;/\n8$/{p;b};D;'
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP