Linux shell 之 sed 命令详解 第一部分
sed 编辑器被称作流编辑器( stream editor),和普通的交互式文本编辑器恰好相反。在交互式文本编辑器中(比如 vim ),你可以用键盘命令来交互式地插入、删除或替换数据中的文本。流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed 编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 sed 编辑器会执行下列操作。
(1) 一次从输入中读取一行数据。
(2) 根据所提供的编辑器命令匹配数据。
(3) 按照命令修改流中的数据。
(4) 将新的数据输出到STDOUT。
在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。
由于命令是按顺序逐行给出的, sed编辑器只需对数据流进行一遍处理就可以完成编辑操作。这使得 sed 编辑器要比交互式编辑器快得多,你可以快速完成对数据的自动修改。
sed 命令的格式如下。
sed options script file
选项允许你修改 sed 命令的行为,可以使用的选项在下表中列出。
script 参数指定了应用于流数据上的单个命令。如果需要用多个命令,要么使用 -e 选项在命令行中指定,要么使用 -f 选项在单独的文件中指定。有大量的命令可用来处理数据。在后面介绍一些 sed 编辑器的基本命令,后续会看到另外一些高级命令 。
命令格式:
1 sed的命令格式:sed [options] 'command' file(s);
2
3 sed的脚本格式:sed [options] -f scriptfile file(s);
选项
-e :直接在命令行模式上进行sed动作编辑,此为默认选项;
-f :将sed的动作写在一个文件内,用–f filename 执行 filename 内的 sed 动作;
-i :直接修改文件内容;
-n :只打印模式匹配的行;
-r :支持扩展表达式;
-h或--help:显示帮助;
-V或--version:显示版本信息。
1. 在命令行定义编辑器命令
默认情况下, sed编辑器会将指定的命令应用到STDIN输入流上。这样你可以直接将数据通过管道输入sed编辑器处理。这里有个简单的示例。
$ echo "This is a test" | sed 's/test/big test/'
This is a big test
$
这个例子在 sed 编辑器中使用了 s 命令。 s 命令会用斜线间指定的第二个文本字符串来替换第一个文本字符串模式。在本例中是 big test 替换了test。
sed 不加选项,默认选项就是 -e
1 $ cat data1.txt
2 the quick brown fox jumps over the lazy dog.
3 The quick brown fox jumps over the lazy dog.
4 The quick brown fox jumps over the lazy dog.
5 The quick brown fox jumps over the lazy dog.
6 $
1 $ sed 's/dog/cat/' data1.txt
1 The quick brown fox jumps over the lazy cat.
2 The quick brown fox jumps over the lazy cat.
3 The quick brown fox jumps over the lazy cat.
4 The quick brown fox jumps over the lazy cat.
5 $
sed 命令几乎瞬间就执行完并返回数据。在处理每行数据的同时,结果也显示出来了。可以在 sed 编辑器处理完整个文件之前就开始观察结果。
重要的是,要记住, sed编辑器并不会修改文本文件的数据。它只会将修改后的数据发送到 STDOUT。如果你查看原来的文本文件,它仍然保留着原始数据。
1 $ cat data1.txt
2 The quick brown fox jumps over the lazy dog.
3 The quick brown fox jumps over the lazy dog.
4 The quick brown fox jumps over the lazy dog.
5 The quick brown fox jumps over the lazy dog.
6 $
2. 在命令行使用多个编辑器命令
要在 sed 命令行上执行多个命令时,只要用 -e 选项就可以了。
1 $ sed -e 's/brown/green/; s/dog/cat/' data1.txt
2 The quick green fox jumps over the lazy cat.
3 The quick green fox jumps over the lazy cat.
4 The quick green fox jumps over the lazy cat.
5 The quick green fox jumps over the lazy cat.
6 $
两个命令都作用到文件中的每行数据上。命令之间必须用分号隔开,并且在命令末尾和分号之间不能有空格。
如果不想用分号,也可以用 bash shell 中的次提示符来分隔命令。只要输入第一个单引号标示出 sed 程序脚本的起始( sed 编辑器命令列表), bash 会继续提示你输入更多命令,直到输入了标示结束的单引号。
1 $ sed -e ' 2 > s/brown/green/ 3 > s/fox/elephant/ 4 > s/dog/cat/' data1.txt 5 The quick green elephant jumps over the lazy cat. 6 The quick green elephant jumps over the lazy cat. 7 The quick green elephant jumps over the lazy cat. 8 The quick green elephant jumps over the lazy cat. 9 $
必须记住,要在封尾单引号所在行结束命令。 bash shell一旦发现了封尾的单引号,就会执行命令。开始后, sed命令就会将你指定的每条命令应用到文本文件中的每一行上。
3、从文件中读取编辑器命令
最后,如果有大量要处理的 sed 命令,那么将它们放进一个单独的文件中通常会更方便一些。可以在 sed 命令中用 -f 选项来指定文件。
1 $ cat script1.sed
2 s/brown/green/
3 s/fox/elephant/
4 s/dog/cat/
5 $
6 $ sed -f script1.sed data1.txt
7 The quick green elephant jumps over the lazy cat.
8 The quick green elephant jumps over the lazy cat.
9 The quick green elephant jumps over the lazy cat.
10 The quick green elephant jumps over the lazy cat.
11 $
在这种情况下,不用在每条命令后面放一个分号。 sed 编辑器知道每行都是一条单独的命令。跟在命令行输入命令一样, sed 编辑器会从指定文件中读取命令,并将它们应用到数据文件中的每一行上。
我们很容易就会把sed编辑器脚本文件与 bash shell 脚本文件搞混。为了避免这种情况,可以使用 .sed 作为 sed 脚本文件的扩展名。
-i、-r 将放到后面的博客中讲解,这篇帮助入门,简单理解