LinuxSir.cn,穿越时空的Linuxsir!

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

[求助] 关于sed的命令 N,P,D

[复制链接]
发表于 2006-3-12 23:05:06 | 显示全部楼层 |阅读模式
小弟最近在学习sed的过程中,有一些地方不是很清楚,希望各位能给予帮助


  1. filename: list

  2. 1. one
  3. 2. two
  4. 3. three
  5. 4. four
  6. 5. five
  7. 6. six
  8. 7. seven
复制代码



  1. [root@localhost sed]# sed -e '1,2{ N; P }' list
  2. 1. one
  3. 1. one
  4. 2. two
  5. 3. three
  6. 3. three
  7. 4. four
  8. 5. five
  9. 6. six
  10. 7. seven
  11. [root@localhost sed]# sed -e '1,3{ N; P }' list
  12. 1. one
  13. 1. one
  14. 2. two
  15. 3. three
  16. 3. three
  17. 4. four
  18. 5. five
  19. 6. six
  20. 7. seven

复制代码


为何以上两个命令的结果是一样的,而且对于命令N添加了下一行到pattern space后,sed是怎么判断行号的啊?
发表于 2006-3-13 08:47:14 | 显示全部楼层
大写 P 只打印到第一个换行符:

[08:43:06 test]$ [color="SeaGreen"]sed -n '1,3{N;N}' files
1. one
[08:43:37 test]$ [color="SeaGreen"]sed -n '1,3{N;N;s/\n//}' files
1. one2. two
[08:44:11 test]$ [color="SeaGreen"]sed -n '1,3{N;N;s/\n/ /}' files
1. one 2. two
[08:44:25 test]$ [color="SeaGreen"]sed -n '1,3{N;N;s/\n/ /g}' files
1. one 2. two 3. three
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-13 09:03:53 | 显示全部楼层
Post by linux_now
大写 P 只打印到第一个换行符:

[08:43:06 test]$ [color="SeaGreen"]sed -n '1,3{N;N}' files
1. one
[08:43:37 test]$ [color="SeaGreen"]sed -n '1,3{N;N;s/\n//}' files
1. one2. two
[08:44:11 test]$ [color="SeaGreen"]sed -n '1,3{N;N;s/\n/ /}' files
1. one 2. two
[08:44:25 test]$ [color="SeaGreen"]sed -n '1,3{N;N;s/\n/ /g}' files
1. one 2. two 3. three


小弟知道P是打印第一行,一楼的两个命令是不同的

  1. sed -e '1,2{ N; P }' list
  2. sed -e '1,3{ N; P }' list  
复制代码

我就是不明白,当N读取了下一行,并输出后
sed在读取第三行记录时,它是认为在读第二行呢还是第三行
也许小弟没有表达清楚...
回复 支持 反对

使用道具 举报

发表于 2006-3-13 09:09:02 | 显示全部楼层
因为有P,所以要想打印指定输出,应该在sed后加上-n选项,因为sed命令默认是输出所以行的。
另外N和n都是读入下一行,也就是在指定的范围内隔一行读一行,N只读入奇数行,n只读入偶数行,呵呵,也有点猜测成分。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-13 09:31:56 | 显示全部楼层
奇怪,公司和家里的机器表现出不同的特征


  1. bash# sed -e '1,2{N;P}' file
  2. one=1234
  3. one=1234
  4. two=ABCD
  5. three=1614.13
  6. four=734.25
  7. five=CDEF
  8. six=2586
  9. seven=EFGH
复制代码


回复 支持 反对

使用道具 举报

发表于 2006-3-13 09:57:03 | 显示全部楼层
Post by johnny_jiang
小弟知道P是打印第一行,一楼的两个命令是不同的

我就是不明白,当N读取了下一行,并输出后
sed在读取第三行记录时,它是认为在读第二行呢还是第三行
也许小弟没有表达清楚...


一个文件的行号是固定的,sed 运行后应该是不会再改变了,sed在读取第三行记录时,它是认为在读第三行。
看看下面的情况,你会明白的:
[09:59:28 test]$ sed  '1,3{N;=}' files
2
1. one
2. two
4
3. three
4. four
5. five
6. six
7. seven

说明:
从上面可以看到,第一遍scrip处理了,两行;第二遍处理了3,4两行;第三遍,从5开始;
所以,sed 在没有用-n 选项时, 处理完一遍script后,就会打印结果,然后接着读取下一行,再用整行的script进行处理;如次循环,直到文件结束。



Post by shizi4838
因为有P,所以要想打印指定输出,应该在sed后加上-n选项,因为sed命令默认是输出所以行的。
另外N和n都是读入下一行,也就是在指定的范围内隔一行读一行,N只读入奇数行,n只读入偶数行,呵呵,也有点猜测成分。



n 是读下一行并覆盖到模板行
N 是读下一行,并接到模板行的尾巴上(通常是换行符后面)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-13 10:08:36 | 显示全部楼层
Post by linux_now
一个文件的行号是固定的,sed 运行后应该是不会再改变了,sed在读取第三行记录时,它是认为在读第三行。
看看下面的情况,你会明白的:
[09:59:28 test]$ sed  '1,3{N;=}' files
2
1. one
2. two
4
3. three
4. four
5. five
6. six
7. seven

说明:
从上面可以看到,第一遍scrip处理了,两行;第二遍处理了3,4两行;第三遍,从5开始;
所以,sed 在没有用-n 选项时, 处理完一遍script后,就会打印结果,然后接着读取下一行,再用整行的script进行处理;如次循环,直到文件结束。






n 是读下一行并覆盖到模板行
N 是读下一行,并接到模板行的尾巴上(通常是换行符后面)


多谢,明白了
回复 支持 反对

使用道具 举报

发表于 2006-3-13 10:15:53 | 显示全部楼层
这个可以作为sed入门辅导教程,是否请版主链接道sed相关部分
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-13 20:38:12 | 显示全部楼层
当已经读取到最后一行后,在用N读取下一条的话,是不是应该会中止啊,包括接下来的命令也应该不会执行吧。
小弟测试下来似乎是这样的,呵呵
回复 支持 反对

使用道具 举报

发表于 2006-3-14 06:44:32 | 显示全部楼层
Post by johnny_jiang
当已经读取到最后一行后,在用N读取下一条的话,是不是应该会中止啊,包括接下来的命令也应该不会执行吧。
小弟测试下来似乎是这样的,呵呵

sed/awk对读入的任何一条记录执行一遍所有的actions,然后读入下一条,再执行一遍,这样知道最后一条后,触到EOF,停止。
回复 支持 反对

使用道具 举报

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

本版积分规则

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