sed命令行格式和标志: sed命令格式:sed [option] 'sed-script' file在命令行上option:
* -n:告诉 sed 不复制所有的行,只复制 p 函数或在 s 函数后 p 标志所指定的行。
* -e:告诉 sed 把下一个参数接受为编辑命令。
* -f:告诉 sed 把下一个参数接受为文件名;这个文件应当包含一行一个的编辑命令。
什么是模式空间?
模式匹配的范围叫做模式空间。一般而言,模式空间是输入文本中某一行,但是可以通过使用 N 命令把多于一行读入模式空间
s(替换):
替换命令语法为[address]s/pattern/replacement/flags
修饰替换标志flags是:
n 1-512之间的一个数字,表示在模式空间里对匹配pattern的字符串第n次出现后开始进行替换,将替换后的行输出stdout
g 对模式空间里匹配pattern的字符串进行全局替换,将替换后的行输出stdout
p 将匹配行的内容替换后输出stdout
w file 将模式空间内容写到文件file中
替换命令s应用于与[address]匹配的行。如果没有指定行,那么就应用于与pattern匹配的所有行。
/<<</,/>>>/,这是一个地址范围(Addresses),后面 {}中的命令只对地址范围之间的内容使用。其中逗号前面的部分是开始地址,逗号后面是结束地址,都是正则表达式。由于sed是“流”式“行”处理,所以结 束地址是可以省略的,即如果地址的结束范围不存在,那么将一直处理到文件结尾。本例中使用这个地址范围主要是缩小处理的数据量,因为虽然后面用N命令把对 一行的处理扩展为了多行,但如果从文件开头一直N扩展到<<<出现为止,buffer中要处理的字符串可能会很长,影响效率。所以去掉 这个处理范围也是能够得到正确结果的,比如:$ sed -e ":begin; { />>>/! { $! { N; b begin }; }; s/<<<.*>>>/COMMENT/; };" test
or
$ sed -e "{:begin; />>>/! { $! { N; b begin }; }; s/<<<.*>>>/COMMENT/; };" test
N;,把下一行的内容追加(append)到缓冲区(pattern)之后,在我们的例子中,在处理aabbcc<<<comment part 1这一行的内容时,就会执行到这里,然后把下一行的内容comment part 2>>>一起放入缓冲区,相当于“合并”成了一行(sed的缓冲区中默认都只会包含一行的内容)。
b begin,由于仍然没有找到结束标记<<<(注意上一条说的缓冲区还没有被处理),所以在这里跳回到标号begin,重新开始命令。如果开始和结束标记之间间隔了多行,那么就会有多次跳转发生。