* sed命令基础
sed是一个行编辑器,它的工作过程是,首先将文件分成以行为单位,然后将每一
行逐次的放入缓冲区(模式空间),sed将其处理完毕后发送到标准输出,处理完最
后一行sed便运行结束。由于sed是对存储在缓冲区的文件进行编辑,因此,sed不
会修改或者损坏正在编辑的文件。
sed命令格式:
: sed [option] 'command' filemame
** option
sed的可选参数比较少,主要就是下面这几个。
- |----+-----------------|
- | -e | 允许多项编辑 |
- |----+-----------------|
- | -f | 指定sed脚本文件 |
- |----+-----------------|
- | -n | 取消默认的输出 |
- |----+-----------------|
** command
不同于grep的pattern,这里command不仅包含了正则表达式所匹配的模式,而且
还包含了对匹配进行处理的命令。同时,sed的匹配是以‘/’开头和结尾的,中
间包含着对文本的匹配模式,如/^less/就是匹配所有以less开头的行。而在匹配
之后跟着的是对匹配结果的处理命令,例如/^less/d就是将所有以less开始的行
删除。命令如下:
- |----+--------------------------|
- | d | 删除一行 |
- |----+--------------------------|
- | i\ | 在当前行插入文本 |
- |----+--------------------------|
- | a\ | 在当前行添加一行或者多行 |
- |----+--------------------------|
- | p | 打印该行 |
- |----+--------------------------|
- | s | 用以个字符串替换另一个 |
- |----+--------------------------|
- | ! | 对所选行以外的进行操作 |
- |----+--------------------------|
- | g | 全局替换 |
- |----+--------------------------|
- | w | 将行写入文件 |
- |----+--------------------------|
- | l | 列出非打印字符 |
- |----+--------------------------|
- | r | 从文件中读取输入行 |
- |----+--------------------------|
- | q | 结束或推出sed |
- |----+--------------------------|
** filename
sed一般只处理一个文件。
** 关于缓冲区和暂存缓冲区的区别
正常情况下,sed将文件以行为单位放入缓冲区,然后按照指令进行操作,最后发
送到标准输出。但是,sed拥有一个暂存缓冲区,它可以将缓冲区的内容保存到暂
存缓冲区中,等到合适的时候再放入缓冲区。使用它们的命令与hgx,其中,命令
h将选中的内容放入暂存缓冲区,g命令将内容发回缓冲区,而x命令则是将缓冲区
和暂存区的内容互换。
* 实例
** 删除文件中的XX行
- #+begin_example
- ~$ sed '1,3d' test
- 5 File formats and conventions eg /etc/passwd
- 6 Games
- 7 Miscellaneous (including macro packages and conventions), e.g.
- man(7), groff(7)
- 8 System administration commands (usually only for root)
- 9 Kernel routines [Non standard]
- # 删除文件的第一到三行
- #+end_example
- #+begin_example
- ~$ sed '/calls/d' test
- 4 Special files (usually found in /dev)
- 5 File formats and conventions eg /etc/passwd
- 6 Games
- 7 Miscellaneous (including macro packages and conventions), e.g.
- man(7), groff(7)
- 8 System administration commands (usually only for root)
- 9 Kernel routines [Non standard]
- # 删除包含calls的行
- #+end_example
** 打印文件的XX行
- #+begin_example
- ~$ sed -n '1,3p' test
- 2 System calls (functions provided by the kernel)
- 3 Library calls (functions within program libraries)
- 4 Special files (usually found in /dev)
- # 打印1-3行
- #+end_example
- #+begin_example
- ~$ sed -n '/calls/p' test
- 2 System calls (functions provided by the kernel)
- 3 Library calls (functions within program libraries)
- # 打印包含calls的行
- #+end_example
** 替换文件中的XX行
- #+begin_example
- ~$ sed -n 's/kernel/hello/p' test
- 2 System calls (functions provided by the hello)
- # 将kernel替换为hello
- #+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在对文件进行编辑的过程中,并不会
破坏源文件,因此可以放心的使用。