欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sed编辑器

程序员文章站 2022-06-21 15:33:13
...

sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式插入、删除或者替换数据中的文本。流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。sed编辑器会执行下列操作。

(1)一次从输入中读取一行数据

(2)根据所提供的编辑器命令匹配数据。

(3)按照命令修改流中的数据。

(4)将新的数据输入到STDOUT.

   在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中所有数据行后,它将会终止。

   犹豫命令时按书序朱行给出的,sed编辑器只需要对数据流进行一遍处理就可以完成编辑操作。它是的sed编辑器要比交互式编辑器快得多,你可以快速完成对数据的自动修改。

sed命令的格式如下:

sed options script file 

选项允许你修改sed命令的行为,可以使用的选项已在表中19-1中列出。

-e script  在处理输入时,将script中指定的命令添加到已有的命令中

-f file 在处理输入时,将file找那个指定的命令添加到已有的命令中

-n 不产生命令输出,使用print命令来完成输出。

   script参数指定了应用于流数据上的单个命令。如果需要用多个命令,要么使用-e 选项在命令行中指定,要么使用-f 选项在单独文件指定。有大龄的命令可用来处理数据。我们将会在本章后面介绍一些sed编辑器的基本命令,然后在第21章看到另外一些的高级命令。

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编辑器强大之处。你可以同事对数据做出多出修改,而所需要小号的时间却只够一些交互式编辑器启动而已。

当然,这个简单的测试只是修改一行数据。不过就算编辑整个文件,处理速度也相差无几。

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.
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.
The quick brown fox jumps over the lazy cat.

    sed命令几乎瞬间就执行完并返回数据。在处理每行数据的同时,结果也就显示出来了。可以在sed编辑器处理完整个文件就开始观察结果。

    重要的是,要记住,sed编辑器并不会修改文本文件的数据。它只会讲修改后的数据发送到STDOUT。如果你查看原有的文本文件,它会仍然保留原始数据。

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.
The quick brown fox jumps over the lazy dog.
 

2 在命令行中使用多个编辑器命令

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.
The quick green fox jumps over the lazy cat.

    两个命令都作用到文件中的每行数据上。命令建必须用分号隔开,并且在命令行末尾和分号之间不能有空格。

    如果不想用分号,也可以使用bash shell 中的次提示符来分隔命令。只要输入第一个单引号标示sed程序脚本的起始(sed编辑器命令列表),bash 会继续提示你输入更多命令,知道输入了标示结束的单引号。

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.
The quick green elephant jumps over the lazy cat.
必须记住,要在封尾单引号所在将结束命令。bash shell一旦发现了封尾的单引号,就会执行命令。开始后,se命令就会将你指定的每条命令应用到文本文件的每一行上。

3 在文件中读取编辑器命令

最后,如果有大量要处理的sed命令,那么将它们放进一个单独的文件中通常会方便一些,可以在sed命令中用-f 选项来指定文件。

cat script1.sed

s/brown/green/

s/fox/elephant/

s/dog/cat/

sed -f script.sed 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.
The quick brown fox jumps over the lazy dog.

在这种情况下,不用在每条命令后放一个分号。sed编辑器知道每一行都是一条单独的命令,跟在命令行输入命令一样,sed编辑器会指定文件中读取命令,并将它们应用到数据文件中的每一行上。

相关标签: linux