LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 957|回复: 6

sed 问题求教

[复制链接]
发表于 2005-7-1 21:10:47 | 显示全部楼层 |阅读模式
[PHP]$ sed -n -e '/ms-sql/,/Monitor/p' services
ms-sql-s         1433/tcp                           #Microsoft-SQL-Server
ms-sql-s         1433/udp                           #Microsoft-SQL-Server
ms-sql-m         1434/tcp                           #Microsoft-SQL-Monitor
ms-sql-m         1434/udp                           #Microsoft-SQL-Monitor

wins             1512/tcp                           #Microsoft Windows Internet
Name Service
wins             1512/udp                           #Microsoft Windows Internet
Name Service
ingreslock       1524/tcp    ingres
l2tp             1701/udp                           #Layer Two Tunneling Protoco
l
pptp             1723/tcp                           #Point-to-point tunnelling p
rotocol
radius           1812/udp                           #RADIUS authentication proto
col
radacct          1813/udp                           #RADIUS accounting protocol
nfsd             2049/udp    nfs                    #NFS server
knetd            2053/tcp                           #Kerberos de-multiplexor
man              9535/tcp                           #Remote Man Server


$ sed -n -e '/ms-sql-s/,/Monitor/p' services
ms-sql-s         1433/tcp                           #Microsoft-SQL-Server
ms-sql-s         1433/udp                           #Microsoft-SQL-Server
ms-sql-m         1434/tcp                           #Microsoft-SQL-Monitor

$  [/PHP]

输出为什么会有这么大差别?
发表于 2005-7-1 22:35:06 | 显示全部楼层
-n -e就不用说了吧

剩下的要明白'/haha/ ,/ghost/p'的含义就ok了
这是两个用逗号分开的规则表达式
sed 将与所有从匹配第一个规则表达式的第一行开始,到匹配第二个规则表达式的行结束(包括该行)的所有行匹配。
例如,以下第2个命令将打印从包含 "haha" 的行开始,并且以包含 "ghost" 的行结束的文本块:

  1. hahaghost@Phidias ~/bak/tmp $ cat testfile
  2. a
  3. b
  4. c
  5. d
  6. haha
  7. e
  8. f
  9. g
  10. h
  11. ghost
  12. i
  13. j
  14. k
  15. .
  16. .
  17. hahaghost@Phidias ~/bak/tmp $ sed -n -e '/haha/,/ghost/p' testfile
  18. haha
  19. e
  20. f
  21. g
  22. h
  23. ghost
  24. hahaghost@Phidias ~/bak/tmp $ sed -n -e '/haha/ ,//p' testfile
  25. haha
  26. e
  27. f
  28. g
  29. h
  30. ghost
  31. i
  32. j
  33. k
  34. .
  35. .
复制代码


如果没发现 "haha",那么将不打印。
如果发现了 "haha",但是在这之后的所有行中都没发现 "ghost",那么将打印所有后续行。
发生这种情况是因为 sed 面向流的特性 -- 它不知道是否会出现 "ghost"。
That's all
:-)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-1 22:37:07 | 显示全部楼层
我的命令 怎么输出差别那么大?
回复 支持 反对

使用道具 举报

发表于 2005-7-1 22:48:32 | 显示全部楼层
2楼的白解释了:(
我看错脱你的意思了
呵呵
下面是为什么差别那么大
看了例子很明显了就,不用我废话了:)
  1. hahaghost@Phidias ~/bak/tmp $ cat testfile2
  2. a
  3. b
  4. c
  5. d
  6. haha
  7. haha1
  8. haha2
  9. haha3 ghost
  10. haha4
  11. e
  12. f
  13. g
  14. h
  15. i
  16. j
  17. k
  18. .
  19. .
  20. hahaghost@Phidias ~/bak/tmp $ sed -n -e '/haha/,/ghost/p' testfile
  21. haha
  22. haha1
  23. haha2
  24. haha3 ghost
  25. haha4
  26. e
  27. f
  28. g
  29. h
  30. i
  31. j
  32. k
  33. .
  34. .
  35. hahaghost@Phidias ~/bak/tmp $ sed -n -e '/haha2/,/ghost/p' testfile
  36. haha2
  37. haha3 ghost

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-1 22:56:19 | 显示全部楼层
thx  
回复 支持 反对

使用道具 举报

发表于 2005-7-2 09:29:17 | 显示全部楼层
我不太懂sed,看了十多分钟才看出你们一看就懂的东西,我的理解是:sed -n -e '/ms-sql/,/Monitor/p' 这个命令,如果输入的连续几行都与第一个正则表达式(这里是/ms-sql/)匹配,就一直打印,不会检测第二个正则表达式的匹配情况(这里是/Moniter/),直到出现一次与第一个正则表达式不匹配的情况时,才开始检测第二个正则表达式.这时如果检测到第二正则表达式,就会打印这行后停止,否则一直打印到输入的行结束为止.
     不知道我的理解是否对,高手过招是点到为止,我们新手只能看热闹,所以请你们回贴时是否稍稍多打几个字,说说简单的原理,谢谢!
回复 支持 反对

使用道具 举报

发表于 2005-7-3 13:06:13 | 显示全部楼层
sed先搜索第一个匹配,比如haha,然后开始往下找第二个匹配ghost,这个过程中如果没有找到就一直打印!如果找到ghost就结束这次匹配,如果没有找到ghost打印到文件末尾!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表