sed流编辑器详解-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 893516
  • 博文数量: 113
  • 博客积分: 3160
  • 博客等级: 少校
  • 技术积分: 1801
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-19 10:09
文章分类

全部博文(113)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: python/ruby

2012-09-18 17:56:43

* sed命令基础

sed是一个行编辑器,它的工作过程是,首先将文件分成以行为单位,然后将每一
行逐次的放入缓冲区(模式空间),sed将其处理完毕后发送到标准输出,处理完最
后一行sed便运行结束。由于sed是对存储在缓冲区的文件进行编辑,因此,sed不
会修改或者损坏正在编辑的文件。

sed命令格式:

: sed [option] 'command' filemame


** option

sed的可选参数比较少,主要就是下面这几个。


  1. |---- -----------------|
  2. | -e | 允许多项编辑 |
  3. |---- -----------------|
  4. | -f | 指定sed脚本文件 |
  5. |---- -----------------|
  6. | -n | 取消默认的输出 |
  7. |---- -----------------|

  
** command

不同于grep的pattern,这里command不仅包含了正则表达式所匹配的模式,而且
还包含了对匹配进行处理的命令。同时,sed的匹配是以‘/’开头和结尾的,中
间包含着对文本的匹配模式,如/^less/就是匹配所有以less开头的行。而在匹配
之后跟着的是对匹配结果的处理命令,例如/^less/d就是将所有以less开始的行
删除。命令如下:



  1. |---- --------------------------|
  2. | d | 删除一行 |
  3. |---- --------------------------|
  4. | i\ | 在当前行插入文本 |
  5. |---- --------------------------|
  6. | a\ | 在当前行添加一行或者多行 |
  7. |---- --------------------------|
  8. | p | 打印该行 |
  9. |---- --------------------------|
  10. | s | 用以个字符串替换另一个 |
  11. |---- --------------------------|
  12. | ! | 对所选行以外的进行操作 |
  13. |---- --------------------------|
  14. | g | 全局替换 |
  15. |---- --------------------------|
  16. | w | 将行写入文件 |
  17. |---- --------------------------|
  18. | l | 列出非打印字符 |
  19. |---- --------------------------|
  20. | r | 从文件中读取输入行 |
  21. |---- --------------------------|
  22. | q | 结束或推出sed |
  23. |---- --------------------------|



** filename

sed一般只处理一个文件。


** 关于缓冲区和暂存缓冲区的区别


正常情况下,sed将文件以行为单位放入缓冲区,然后按照指令进行操作,最后发
送到标准输出。但是,sed拥有一个暂存缓冲区,它可以将缓冲区的内容保存到暂
存缓冲区中,等到合适的时候再放入缓冲区。使用它们的命令与hgx,其中,命令
h将选中的内容放入暂存缓冲区,g命令将内容发回缓冲区,而x命令则是将缓冲区
和暂存区的内容互换。



* 实例

** 删除文件中的xx行


  1. # begin_example
  2. ~$ sed '1,3d' test
  3. 5 file formats and conventions eg /etc/passwd
  4. 6 games
  5. 7 miscellaneous (including macro packages and conventions), e.g.
  6. man(7), groff(7)
  7. 8 system administration commands (usually only for root)
  8. 9 kernel routines [non standard]
  9. # 删除文件的第一到三行
  10. # end_example



  1. # begin_example
  2. ~$ sed '/calls/d' test
  3. 4 special files (usually found in /dev)
  4. 5 file formats and conventions eg /etc/passwd
  5. 6 games
  6. 7 miscellaneous (including macro packages and conventions), e.g.
  7. man(7), groff(7)
  8. 8 system administration commands (usually only for root)
  9. 9 kernel routines [non standard]
  10. # 删除包含calls的行
  11. # end_example


** 打印文件的xx行


  1. # begin_example
  2. ~$ sed -n '1,3p' test
  3. 2 system calls (functions provided by the kernel)
  4. 3 library calls (functions within program libraries)
  5. 4 special files (usually found in /dev)
  6. # 打印1-3行
  7. # end_example



  1. # begin_example
  2. ~$ sed -n '/calls/p' test
  3. 2 system calls (functions provided by the kernel)
  4. 3 library calls (functions within program libraries)
  5. # 打印包含calls的行
  6. # end_example


** 替换文件中的xx行


  1. # begin_example
  2. ~$ sed -n 's/kernel/hello/p' test
  3. 2 system calls (functions provided by the hello)
  4. # 将kernel替换为hello
  5. # end_example


其实关于sed的命令还有很多,但是只要你掌握了基础用法,其它的照着模子就能
刻出来。而且sed无非就是grep的升级版,它不仅可以匹配,而且能将匹配的行作
出某种修改,但是sed仍有局限。它不能将每一行分成若干单位进行处理,这时候
awk就起到作用了,下一节会专门介绍awk实用程序。


* 回顾

** 将所有包含sam的行打印

: sed -n '/sam/p' file


** 删除包含sam的行

: sed '/sam/d' file


** 删除从sam行开始到tom行结束之间所有的行

: sed '/sam/,/tom/d' file


** 删除第1行到第5行之间所有的行

: sed '1,5d' file


** 删除所有不包含sam的行

: sed '/sam/!d' file

** 将包含sam行的love改成hate

: sed '/sam/s/love/hate/g' file


** 删除每行前4个字符

: sed 's/....//' file


** 删除每行后三个字符

: sed 's/...$//' file


** 将所有包含sam的行写入new文件中

: sed -n '/sam/w new' file

** 将所有的包含functions的行替换成funchello

: sed 's/\(func\)tions/\1hello/' file

# 其中括号内包括的内容作为标记放入寄存器,然后由\1调用。


* 总结

sed作为一个行为单位进行编辑的工具,使得其可以编辑相当大的文件,不会存在
像vi那样打不开文件的情况;除此之外,sed在对文件进行编辑的过程中,并不会
破坏源文件,因此可以放心的使用。

阅读(4013) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图