转载自:http://www.cnblogs.com/sinaxyz/archive/2012/12/16/2820781.html
1、sed编辑器被称作流编辑器(stream aditor),跟普特的交互式文本编辑器恰好相反。在交互式文本编辑器中(比如vim),你可以用键盘命令来交互地插入、删除或替换数据中的文本。流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以基于输入到命令行的或是存储在命令文本中的命令来处理数据流中的数据。它每次从输入中读取一行,用提供的编辑命令匹配数据、按命令中指定的方式修改流中的数据,然后生成的数据输出到STDOUT。在流编辑器将所有命令与一行数据进行匹配后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会停止。
使用sed命令格式如下:
sed options script file
选项有:
-e script 在处理输入时,将script中指定的命令添加到运行的命令中
-f file 在处理输入时,将file中指定的命令添加到运行的命令中
-n 不要为每个命令生成输出,等待print命令输出
1)在命令行定义编辑命令
$ echo "This is a test" | sed 's/test/big test/'
This is a big test
$ cat data1
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
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.
2)在命令行使用多个编辑器命令(要使用-e选项)
$ sed -e 's/brown/green/; s/dog/cat/' data1
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.
3)从文件中读取编辑器命令(使用-f选项)
$ cat script1.sed
s/brown/green/
s/fox/elephant/
s/dog/cat/
$ sed -f script1.sed data1
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.
2、sed编辑器基础
1)替换标记
关于substitute命令如何替换字符串中匹配的模式需要注意一点,就是在默认情况下它只替换每行中出现的第一处。要让替换命令对一行中不同地方出现的文本都起作用,必须使用替换标记(substitution flag)
s/pattern/repacement/flags
1> 数字,表明新文本将替换第几处模式匹配的地方;
2> g,表明新文本将会替换所有已有文本出现的地方;
3> p,表明原来行的内容要打印出来;
4> w file,将替换原来行的结果写到文件中。
$ echo "This is a test" | sed -n 's/test/big test/p'
This is a big test
注意:-n选项将禁止sed编辑器输出,但p替换标记会输出修改过的行,将二者配合全盘则会只输出被substitute命令修改过的行。
2)替换字符
$ sed 's/\bin\/bash/\/bin\/csh/' /etc/passwd
sed编辑器可以用感叹号用作分隔符,使得路径名更容易被读取和理解
$ sed 's!/bin/bash!/bin/cash!' /etc/passwd
3)使用地址
默认情况下,在sed编辑器中使用的命令会作用于文本数据的所有行。如果只想作用于特定的某行或某些行,你必须用行寻址(line addressing)。
在sed编辑器中有两种形式的行寻址:
1》行的数字范围;
2》用文本模式来过滤出某行。
两种形式都使用相同的格式来指定地址:
[address]command
也可以为特定的地址将多个命令放在一起:
address{
command1
command2
command3
}
1> 数字方式的行寻址
$ sed '2s/dog/cat/' data1
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy cat.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
$ sed '2,3s/dog/cat/' data1
The quick brown fox jumps over the lazy dog.
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 dog.
$ sed '2,$s/dog/cat/' data1
The quick brown fox jumps over the lazy dog.
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.
2> 使用文本模式过滤器
格式如下:
/pattern/command
$ echo "This is a test" | sed '/test/s/test/TEST/'
This is a TEST
3> 组合命令
如果需要在单行上执行多条命令,可以用花括号将多条命令组合在一起。
$ sed '2{
> s/fox/elelhant/
> s/dog/cat/
> }' data1
The quick brown fox jumps over the lazy dog.
The quick brown elelhant jumps over the lazy cat.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
4)删除行
$ cat data2
line1
line2
line3
line4
$ sed '3d' data2
line1
line2
line4
你可以删除用两个文本模式来删除某个范围内的行,但这么做时要小心。你指定的第一个模式会“打开”行删除功能,第二个模式会“关闭”行删除功能。sed编辑器会删除两个指定行之间的所有行(包括指定的行)
$ sed '/1/,/3/d' data2
line4
如果“打开”了删除功能,而没有“关闭”,则会删除之后所有的数据。
$ sed '/1/,/5/d' data2
5)插入和附加文本
1》插入(insert)命令i会在指定行前增加一个新行;
2》追加(append)命令a会在指定行后增加一个新行。
不能在单个命令行上使用这两条命令。你必须指定是要将行插入还是附加到另一行。格式如下:
sed '[address]command\
new line'
new line中文本将会出现在sed编辑器输出中你指定的位置。记住,当使用插入命令时,文本会出现在数据流文本的前面,而当使用附加命令时,文本会出现在数据流文本的后面:
$ echo "Test line 2" | sed 'i\Test line 1'
Test line 1
Test line 2
$ echo "Test line 2" | sed 'a\Test line 1'
Test line 2
Test line 1
6)修改行
修改(change)命令允许修改数据流中整行文本的内容。它跟插入和附加命令的工作机制一样,你必须在sed命令中单独指定新行。
$ sed '3c\This is a changed line' ./data2
line1
line2
This is a changed line
line4
也可以在修改命令中使用地址区间,但结果可能不是你想要的(因为它是包括区间所在的行):
$ sed '2,3c\This is a changed line' ./data2
line1
This is a changed line
line4
7)转换命令
转换(transform, y)命令是唯一可以处理单个字符的sed编辑命令。转换命令格式如下:
[address]y/inchars/outchars/
转换命令会进行inchars和outchars值一对一映射。
$ sed 'y/1234/6789/' data2
line6
line7
line8
line9
转换命令是全局的,也就是说,它会自动替换文本行中找到的指定字符的所有实例,
$ echo "this 1 is a test of 1 try." | sed 'y/123/456/'
this 4 is a test of 4 try.
8)回顾打印
这里有3条也能用来打印数据流中的信息的命令:
1> 小写p命令用来打印文本行;
2> 等号(=)命令用来打印等号;
3> 小写l命令用来列出行。
$ echo "This is a test" | sed 'p'
This is a test
This is a test
$ sed '=' data1
1
The quick brown fox jumps over the lazy dog.
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.
9)用sed和文件一起工作
1》向文件写入
[address]w filename
$ sed '1,3w test' data2
line1
line2
line3
line4
$ cat test
line1
line2
line3
2》向文件读取数据
读取命令(r)允许你将一个独立文件中的数据插入到数据流中。
[address]r filename
$ cat data3
This line contains tabs.
$ sed '3r data3' data2
line1
line2
line3
This line contains tabs.
line4