sed寻址

1,248 阅读3分钟

前言

sed编辑器被称作流编辑器(stream editor),可以根据预先定义的规则对数据进行处理。其工作流程如下:

  1. 一次从输入中读取一行数据
  2. 根据所提供的编辑器命令匹配
  3. 按照命令修改流中的数据
  4. 将新的数据输出到STDOUT

地址

默认情况下,sed编辑器会对所有行进行操作。如果只想对特定的行执行操作,需要使用行寻址行寻址有两种寻址方式:1. 以数字的方式;2. 以文本的方式。下面的举例操作都使用了文件data.txt,内容如下

data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35

数字方式寻址

sed编辑器会对每行进行编号,从1开始递增。数字方式寻址中的数字表示的是当前处理的行是流数据中的第几行。例如对第2行的数据完成对字符串datasubstitute的替换。命令s替换操作使用的参数gglobal的意思,表示对匹配的字符串全部进行替换,不添加参数的时候只会替换第一个。

sed '2s/data/substitute/g' data1.txt

打印的结果如下,只修改了第二行的datasubstitute

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的行完成data22data的替换

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

如果数据流中有多对string1string2,那么每对string1string2之间的行(包括包含string1string2的行)的数据流都会执行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