4.1 Addresses overview
地址用来指定命令在哪些行执行。没有指定地址的话,则命令应用到所有行。
用行号指定, 地址行号从1开始。
sed '144s/hello/world'
通过正则表达式匹配来指定,如下apple是匹配行的正则表达式。
sed '/apple/s/hello/world'
通过行号区间匹配
sed '4,17/s/hello/word/'
在地址后面跟一个!,表示选取相反的行。
4.2 Selecting lines by number
number 指定行
$ 最后一行
first~step
匹配first + (n*step)行。
4.3 selecting lines by text matching
/regexp/
\%regexp%
%也替换为别的符号,当表达式本身含有很多斜杠时很有用。注意s命令的分割符要和这个分隔符一样。
也可以有修饰符I, M,不关心大小写和多行模式。
如下,匹配a的行,不关新大小写。
1 2 3 4 5 | $ sed /a/Is/b/c/ ab ac Ab Ac |
4.4 Range Addresses
用逗号分开的两个地址,最简单的如
1 2 3 4 | $ seq 10 | sed -n 4,6p 4 5 6 |
第二个地址,如果是正则表达式,从起始行号开始,直到正则表达式匹配的行。
1 2 3 4 5 6 | $ seq 10 | sed -n 2, /6/p 2 3 4 5 6 |
如果正则表达式,从起始地址之后,未匹配,则一直匹配到文件结束。正则表达式从起始行的下一行开始匹配。起始行可以为0,则正则表达式从第一行开始匹配。
第二个地址,可以为+N。表示匹配起始行,以及其后的N行。
第二个地址可以为,~N。表示匹配起始行到结束行,结束行是起始行之后的第一个N的整数倍行号。
参考
sed manual