Linux中,除了VI这种交互式的文本编辑器(interactive text editor),还有两个命令行文本编辑器(command line editor),就是sed和gawk,本文介绍sed命令。
sed
sed是stream editor,流编辑器。其处理流程:
- 每次从输入流中读取一行数据
- 将数据交给指定的命令处理
- 根据命令改变数据
- 将数据输出到STDOUT
当一行数据处理完成,就读取下一行数据重复这个过程,直到所有的数据处理完成。
sed命令语法:
sed options script file
options参数有:
Option | Description |
---|---|
-e script | 使用指定的多个命令来处理数据 |
-f file | 使用指定文件中的命令来处理数据 |
-n | 不产生输出,直到使用print命令 |
script参数只能指定一个命令,如果需要多个命令需要使用-e
option,或者使用-f
option。
使用一个命令
sed默认处理STDIN输入流中的数据,所以可以使用管道(pipe):
$ echo "This is a test" | sed 's/test/big test/'
This is a big test
s
命令(substitute):文件替换,使用big test替换test,注意三个斜线。
处理指定文件
$ cat data1.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
$ sed 's/dog/cat/' data1.txt
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy cat.
sed不修改原文件内容,只是将处理的结果发送到STDOUT,所以data1.txt的内容不会改变。
使用多个命令
使用-e
option来指定多个命令。
$ sed -e 's/brown/green/; s/dog/cat/' data1.txt
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
多个命令之前要用分号间隔开,并且分号前不能有空格
除了使用分号,还可以使用secondary prompt:
$ sed -e '
> s/brown/green/
> s/fox/elephant/
> s/dog/cat/' data1.txt
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
当输入了第一个单引号后,bash会开启secondary prompt,直到出现第二个单引号,当出现第二个单引号,必须输入后续完整的命令参数,因为该行结束,bash就会执行命令。
从文件中读取命令
如果有很多的sed命令,可以将命令写在文件中,然后使用-f
option来指定该文件。
$ cat script1.sed
s/brown/green/
s/fox/elephant/
s/dog/cat/
$ sed -f script1.sed data1.txt
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
The quick green elephant jumps over the lazy cat.
将sed使用的命令所在文件的后缀标识为.sed,方便识别。另外,命令不需要使用分号间隔,每个命令一行即可。
参考:Linux Command Line and Shell Scripting Bible 3rd Edition 第19章