免费注册 查看新帖 |

Chinaunix

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

问一个有关sed匹配模式的话题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-12 14:06 |只看该作者 |正序浏览
我有个文件,其内容是
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.

我使用如下命令,得到如下结果

  1. [caoke@Linux ~]$ sed -n '/It/,2'p tmp.sed
  2. It was an evening of splendid music and company.
复制代码
我使用如下命令,得到如下结果

  1. [caoke@Linux ~]$ sed -n '/an/,2'p tmp.sed
  2. The honeysuckle band played all night long for only $90.
  3. It was an evening of splendid music and company.
  4. The local nurse Miss P.Neave was in attendance.

  5. [color=Red]很奇怪,不是应该在第二行范围内搜索吗?[/color]
复制代码
这两个命令有什么区别

  1. sed -n '/an/,2'p tmp.sed
  2. sed -n '2,/an/'p tmp.sed
复制代码
不胜感激

论坛徽章:
0
76 [报告]
发表于 2010-04-20 15:50 |只看该作者
本帖最后由 jakepain 于 2010-04-20 15:59 编辑

是这样...

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
75 [报告]
发表于 2010-04-14 18:29 |只看该作者
回复 73# jerryjzm


    你这个与我所说的不矛盾吧?

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
74 [报告]
发表于 2010-04-14 17:17 |只看该作者
1、地址范围的right operand是pattern的时候:
http://bbs.chinaunix.net/viewthread.php?tid=1689518#pid12055900

range operator maintains its own Boolean state.
It is false as long as its left operand is false. Once the left operand is true, the range operator stays true until the right operand is true, after which the range operator becomes false again.
The operator doesn't become false until the next time it is evaluated.

实例:
http://bbs.chinaunix.net/viewthr ... ;page=7#pid12057544

2、地址范围的right operand是row number的时候:
http://bbs.chinaunix.net/viewthr ... ;page=7#pid12061055

'/str/,7 p' 找到str,一直print到第7行;接着找str,后面的行号大于7,只打印匹配str的当前行。

实例:
http://bbs.chinaunix.net/viewthr ... ;page=6#pid12057509

论坛徽章:
1
天秤座
日期:2013-10-23 13:20:42
73 [报告]
发表于 2010-04-14 17:04 |只看该作者
回复  mr_caoke


    早就解释清楚了。


   add1, add2地址对(范围),基本的就不说了。

我再重 ...
blackold 发表于 2010-04-12 17:19


黑哥,对于
我再重复一下。
   /an/,2p  第1行匹配/an/,地址范围为真,执行p;
第2行,匹配2, 地址范围为真, 执行p, 之后地址范围为假(重置)

这段有点不通看法,
既然是/an/,2p,   /an/是个匹配字段,那/an/ 找的行<=2时,sed 就自动将/an/到2行的内容全部p出来。
而到到/an/匹配而 >2行时,就只p出这一行了
不知我的看法是否正确。

论坛徽章:
0
72 [报告]
发表于 2010-04-14 16:38 |只看该作者
回复  crowsy001

QUOTE cat -A urfile
1 an$
2 an$
3 an$
4$
5 an$



QUOTE cat urfile
1 an
2 an
3 an
4
5 an

$ sed -n '/an/,2p' urfile
1 an
2 an
3 an
5 an
blackold 发表于 2010-04-12 21:57


为什么这里不打印第四行呢?谁解释一下,谢谢

论坛徽章:
0
71 [报告]
发表于 2010-04-14 11:09 |只看该作者
回复 70# alfred1980


    之前的帖够清楚了。。。

论坛徽章:
0
70 [报告]
发表于 2010-04-14 10:57 |只看该作者
说实在还是搞不明白
谁来个总结陈辞啊!

论坛徽章:
0
69 [报告]
发表于 2010-04-13 17:32 |只看该作者
sed -n 'a,b p' filename

a b 可以是行号, 可以是模式匹配
找到a 开始打印,到b结束;再重新找a,打印,到b结束。。。直到文件尾

'3,7 p' 打印3到7行
'/str/,7 p' 找到str,一直print到第7行;接着找str,后面的行号大于7,只打印匹配str的当前行。

论坛徽章:
0
68 [报告]
发表于 2010-04-13 13:53 |只看该作者
/add1/add2/

我的理解是,找到add1,再找add2;如果找不到add2,直到末尾。
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP