免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3632 | 回复: 5

用sed显示匹配regex的行在内上多少行 或 下多少行 [复制链接]

论坛徽章:
0
发表于 2007-03-24 18:59 |显示全部楼层
显示匹配regex在内的上23行


  1. sed -n ':a
  2. /regex/{p;q;}
  3. $q;
  4. N;24,$D;ba' mytest.txt
复制代码







显示匹配regex在内的下23行


  1. sed -n '/regex/{:a
  2. N;${p;q;}
  3. /\(..*\n\)\{22\}/!ba
  4. p;q;}' mytest.txt
复制代码

论坛徽章:
0
发表于 2007-03-24 19:01 |显示全部楼层
看看大家有什么其他的解法。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2007-03-25 18:35 |显示全部楼层
doc兄目前似乎对sed比较着迷,呵呵。^_^

这两个的练习,用grep做很直接,是正解。不过用sed来练习也不错啊。
doc兄两段代码都不错,不用GSed的新特性的话也很难有更简单的做法。水平不错,值得鼓励!^_^

不过两段代码都只能适应一个匹配的情形。但第二段代码只要将第二个q去掉就能对付多个匹配了。不过..*最好改成.*,空行也是有效的一行,不是吗?否则遇到空行时就会多打印内容了。

第一段只要像第二段一样在模式空间判断\n的个数,并且去掉第一个q的话也可以对付多个匹配。另外$q;N可以用$!N代替。

第二个练习如果用Gsed是有个简单的解法,不过通用性上就会差些了:
sed -n '/pattern/,+22p'

论坛徽章:
0
发表于 2007-03-25 18:54 |显示全部楼层
多谢woodie兄的指点。你的意见很中肯。
我只是喜欢sed的简单和灵活。所以最近回复sed问题的帖子比较多,也同时在其他人的回复中学到了很多。
每次都有意外的发现和收获。
感觉Shell版是CU上水平最高,气氛最好的版(个人观点,呵呵)。

论坛徽章:
0
发表于 2007-03-26 09:00 |显示全部楼层
grep做这个简单, 有ABC这些参数.

sed 不错, 但是解决问题时候, 应该用最有效的办法^^

论坛徽章:
0
发表于 2007-03-26 14:13 |显示全部楼层
#显示/^Title/ 及前面3行:

  1. sed -n '
  2.         H
  3.         /^Title/{
  4.                 x
  5.                 s,.*\(\(.*\n\)\{4\}\),\1,
  6.                 p
  7.                 s,.*,,
  8.                 x
  9.         }
  10. ' urfile
复制代码


#显示/^Title/ 及下面1行:

  1. sed -n '
  2. /^Title/{
  3.         $p
  4.         N
  5.         p
  6. }' urfile
复制代码


#显示/^Title/ 及下面2行以上:

  1. sed -n '
  2. /^Title/{
  3.         :loop
  4.         $p
  5.         N
  6.         x
  7. #{0,0} 2行,{0,1} 3行,以此类推
  8.         s-^.\{0,1\}$-#&-
  9.         x
  10.         t loop

  11.         p
  12.         s,.*,,
  13.         h
  14. }' urfile
复制代码


注:没有考虑效率 ^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP