* 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在对文件进行编辑的过程中,并不会
破坏源文件,因此可以放心的使用。

09-15 03:20