=== 目录 ===
简介
返回目录
本文介绍了sed
命令的基本规则和基础用法。如果希望了解sed
命令的高级用法,请搜索其它教程。据说完整地介绍sed
需要一本书。
sed
是 Stream EDitor 的缩写。sed
的好处是,不需要像vim
那样打开文件后才能编辑,在shell
脚本中,如果要对文本做一些简单的处理(比如插入、删除文本行、替换),可以用sed
命令实现。
sed 命令的执行过程
返回目录
执行 sed
命令需要告诉 sed
两样东西:sed script
和待处理的文本。sed script
包含一条或多条sed command
(sed
命令)。开始执行后,sed
命令一行一行地处理给定的文本,对每一行,依次应用给定的sed
命令。
# 把单词 'hello' 替换成 'world'
$ echo 'hello' | sed 's/hello/world/'
world
这个示例中,sed命令
只有一条:s/hello/word/
,待处理的文本也只有一行:word
。命令的作用:用word
替换hello
。
sed
确定sed script
和待处理文本的逻辑是:
- 用
-e
指定sed命令
,或者用-f
指定`sed 脚本的文件命名 - 如果这两个选项都没有,那第一个非
sed
选项参数被解析为sed 命令
。 - 其余非选项参数被人为是待处理的文本文件的名字。
- 如果没有给定待处理的文件名,或这文件名为
-
,则从标准输入 stdin
读取待处理文本。非sed选项参数是指第一个不以-
开头的参数。
可以同时使用-e
和-f
,可以多次使用-e
和-f
。
下面是相应的示例代码。
# 用含有三行带编号的 hello 的文件做测试
$ cat tri-hello.txt
1 hello
2 hello
3 hello
# 把每一行的 hello 替换为 "world"
$ sed -e 's/hello/world/' tri-hello.txt
1 world
2 world
3 world
# 如果不用 -e 和 -f 选项,第一个非选项参数就是要执行的 sed 命令
$ sed 's/hello/world/' tri-hello.txt
1 world
2 world
3 world
# 用 -e 选项,可以把要执行的 sed (子)命令放在后面,例如:
$ sed tri-hello.txt -e 's/hello/world/'
1 world
2 world
3 world
# 如果省略文件名,sed命令会从标准输入获取要处理的文本
$ echo 'word' | sed 's/hello/world/'
world
$ cat tri-hello.txt | sed 's/hello/world/'
1 world
2 world
3 world
sed
命令开始执行后,其处理步骤简要概括如下:
- 从
input stream
中取出一行文本,放入一个叫pattern sapce
的地方, - 把 sed script 里的命令逐个应用到这一行文本上,
- 如果没有指定
-n
选项,把pattern space
里的内容(就是处理后的文本)输出到output stream
中,否则转至步骤 4. - 最后清空
pattern space
; - 取出下一行文本,继续下一个处理循环。
完整的处理循环参考 gnu 关于 sed 的在线文档中Execution-Cycle部分的内容。
-i --in-place选项
返回目录
,使用-i直接修改文件内容,不输出。
$ for i in {
1