免费注册 查看新帖 |

Chinaunix

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

sed --- n , N [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-03 08:55 |只看该作者 |倒序浏览
man sed

  1. n N    Read/append the next line of input into the pattern space.
复制代码

example

  1. $cat a
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. $sed  'N;D' a
  13. 10
  14. $sed  'n;D' a
  15. 1
  16. 3
  17. 5
  18. 7
  19. 9
  20. $
复制代码

n,N不是一样的命令吗?

论坛徽章:
0
2 [报告]
发表于 2008-08-03 08:58 |只看该作者
是不是该这样解释:
n  Read  the next line of input into the pattern space.
N  append the next line of input into the pattern space.

论坛徽章:
0
3 [报告]
发表于 2008-08-03 09:18 |只看该作者
刚试验了一下,是我理解有误,应该按2#解释

  1. $sed -n '1{N;N;s/3/a/g;p}' a
  2. 1
  3. 2
  4. a
  5. $sed -n '1{n;n;s/3/a/g;p}' a
  6. a
  7. $sed -n '1{n;n;p}' a
  8. 3
复制代码

  1. h  H    Copy/append pattern space to hold space.
  2. g  G    Copy/append hold space to pattern space.
复制代码

也是如此

[ 本帖最后由 爱知 于 2008-8-3 11:23 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-08-03 09:27 |只看该作者
还有一个问题:
基础十二问中
sed行匹配中说:
/ p a t t e r n / p a t t e r n / 查询包含两个模式的行。例如/ d i s k / d i s k s /
我怎么试验都无法实现
$sed -n '/3/5/p' a
sed:-e 表达式 #1,字符:4:unknown command: `5'
不知为何?

论坛徽章:
0
5 [报告]
发表于 2008-08-03 10:14 |只看该作者

回复 #4 爱知 的帖子

爱知好用功啊,礼拜天大清早的就开始学习了

你的问题我很早就有过疑问,很多资料上面都是这样写的,而其实不对。
我看所有人在处理这种问题的时候都用sed '/3/{/5/}'这样的方式,说明本身这种写法就不存在。如果存在为什么别人还要舍近求远呢。

论坛徽章:
0
6 [报告]
发表于 2008-08-03 10:21 |只看该作者
谢谢,还有一问:

  1. $cat a
  2. hello world a b c
  3. world
  4. $sed -n '/a/{/b/p}' a
  5. hello world a b c
  6. $
复制代码

为什么
$sed -n '/a/{/b/}p' a
不行呢?
是不是对应的命令必须得放在{}里

[ 本帖最后由 爱知 于 2008-8-3 10:23 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-08-03 10:31 |只看该作者

回复 #6 爱知 的帖子

sed '/pattern/command' file
sed '/pattern/{command}' file

sed中有这样的方式,可以看出前面一个pattern对应后面一个命令,如果你想扩展的话,就可以加一个{},{}这个里面要写的东西等价与sed的‘’单引号中要写的东西。
好,下面请看你的命令sed -n '/a/{/b/}p' a
你的{}中只有匹配,而没有command,这是错误之一,就像这样的错误一样 sed -n '/a/'
其次,/a/与{/b/}的关系就是一个pattern对应一个命令的关系,而你后面再加一个p命令,岂不就多了一个命令,这样的错误类似于:
sed -n '/a/p'   没有错
但你可以这样写吗: sed -n '/a/pp'

论坛徽章:
0
8 [报告]
发表于 2008-08-03 10:41 |只看该作者

回复 #7 eeeef 的帖子

奥,原来如此,谢谢
以此类推
这'/p1/{/p2/{/p3/...}}'      可以匹配许多个喽
那'/p1/{/p2/cmd1,/p3/cmd2,...}' 也可以了
前面两个联合在一起,        也可以了
sed 真强大!!!

论坛徽章:
0
9 [报告]
发表于 2008-08-03 10:45 |只看该作者

回复 #8 爱知 的帖子

对,就是这样,这样的方式很好理解,但需要灵活使用。
你的这句话中“那'/p1/{/p2/cmd1,/p3/cmd2,...}' 也可以了”
注意中间是;,如果你使用,,那么肯定会报错,你可以试一下。

论坛徽章:
0
10 [报告]
发表于 2008-08-03 10:47 |只看该作者

  1. sed 真强大!!!
复制代码

照以上推:sed可以实现顺序,条件,循环三种控制结构
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP