前言
sed编辑器被称作流编辑器(stream editor),可以根据预先定义的规则对数据进行处理。其工作流程如下:
- 一次从输入中读取一行数据
- 根据所提供的编辑器命令匹配
- 按照命令修改流中的数据
- 将新的数据输出到STDOUT
地址
默认情况下,sed编辑器会对所有行进行操作。如果只想对特定的行执行操作,需要使用行寻址。行寻址有两种寻址方式:1. 以数字的方式;2. 以文本的方式。下面的举例操作都使用了文件data.txt,内容如下
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
数字方式寻址
sed编辑器会对每行进行编号,从1开始递增。数字方式寻址中的数字表示的是当前处理的行是流数据中的第几行。例如对第2行的数据完成对字符串data到substitute的替换。命令s替换操作使用的参数g是global的意思,表示对匹配的字符串全部进行替换,不添加参数的时候只会替换第一个。
sed '2s/data/substitute/g' data1.txt
打印的结果如下,只修改了第二行的data为substitute
data11,data12,data13,data14,data15
substitute21,substitute22,substitute23,substitute24,substitute25
data31,data32,data33,data34,data35
除了指定特定的行外,还可以支持范围寻址,比如说第一行到第二行
sed '1,2s/data/substitute/g' data.txt
这样就第一行和第二行的数据都修改了,打印的结果如下
substitute11,substitute12,substitute13,substitute14,substitute15
substitute21,substitute22,substitute23,substitute24,substitute25
data31,data32,data33,data34,data35
文本方式寻址
除了数字方式寻址外,还可以对含有特定文本的行执行操作。例如对含有文本data22的行完成data22到data的替换
sed '/data22/s/data22/data/' data.txt
执行的结果如下
data11,data12,data13,data14,data15
data21,data,data23,data24,data25
data31,data32,data33,data34,data35
当然,文本寻址方式也是可以支持指定范围内的数据执行操作的,下面的命令表示的是从遇到data11开始执行替换的操作,遇到data21之后就不再执行操作了。
sed '/data11/,/data21/s/data/substitute/g' data.txt
执行的结果如下。
substitute11,substitute12,substitute13,substitute14,substitute15
substitute21,substitute22,substitute23,substitute24,substitute25
data31,data32,data33,data34,data35
/string1/,/string2/的行寻址表示的是,sed编辑器在遇到string1会开始执行指令,然后遇到string2会不在执行指令。第一个匹配的字符串表示命令开始执行,第二个字符串表示不再执行。比如说设置的是文件中不存在的字符串作为第二个字符串,那么就会对匹配了第一个字符串之后的行都执行操作,执行如下命令
sed '/data11/,/aaaa/s/data/substitute/g' data.txt
可以看到全部的data都被修改为了substitutes。
substitute11,substitute12,substitute13,substitute14,substitute15
substitute21,substitute22,substitute23,substitute24,substitute25
substitute31,substitute32,substitute33,substitute34,substitute35
如果数据流中有多对string1和string2,那么每对string1和string2之间的行(包括包含string1或string2的行)的数据流都会执行sed中的指令。
其他
让我碰到就懵逼的寻址方式是如下的,左看又看不知道到底是干啥的。既不像是数字寻址,也不像是文本寻址。直到最后似乎知道了,是数字寻址和文本寻址两种方式的结合。也就是对从第一行到含有data21的文本行都执行操作。
sed '1,/data21/s/data/substitute/g' data.txt
这样打印的结果就是可预见的了,如下:
substitute11,substitute12,substitute13,substitute14,substitute15
substitute21,substitute22,substitute23,substitute24,substitute25
data31,data32,data33,data34,data35