sed命令

1、sed一次读取一行数据,把读取的数据拷贝到模式空间,在模式空间(pattern space )内处理数据,然后读入下一行数据,直到结束。
2、sed并不是直接处理原数据,而是对原数据的副本进行处理,因此没有改变原数据。如果想直接改变原数据,使用 -i cfg.cnf
3、默认情况下,sed对每一行都进行处理。可以指定只对哪些行处理,有两种方式:
     a、地址范围,如1,4,对第1行到第4行的行进行处理。
     b、匹配模式,如/my,对包含my的行进行处理。
4、sed的处理流程:从输入流中读取一行数据,放入模式空间,检查这一行是否需要处理(通过地址范围或者匹配模式),如果需要处理,在模式空间加工数据,然后把模式空间的内容,打印到标准输出。如果不需要处理,不处理,把模式空间的内容,打印到标准输出。清除模式空间的内容,读取下一行。
5、sed在读取下一行之前,都先把处理后的模式空间内容,打印到标准输出。有些行,我不想打印,怎么办?
6、有两种解决办法:
a、对不想打印的行,执行d操作。相当于对模式空间执行d操作,模式空间为空(不是空行),打印到标准输出,也是为空。 b、对想要打印的行,执行p操作,这样就是把模式空间的内容打印到标准输出。同时使用-n选项,取消读取下一行之前,对模式空间内容的打印。
7、sed取下一行之前,把模式空间的内容打印到标准输出,并且清除模式空间的内容,如果想保存模式空间的内容怎么办?
使用保留空间(Hold Space)
8、从模式/行为的角度理解。模式:一般是关系式或者正则表达式,对一条记录,进行匹配。行为:一般是一组命令,对匹配的记录进行处理,每个命令在前一个命令处理后的结果上,继续处理。
9、可以认为sed有三层循环,第一层遍历所有的行,第二层遍历一组模式/行为,第三层遍历行为中的一组命令。
10、特别注意!非的含义,'2p' 表示对第二行打印,'2!p' 不是表示对第2行不打印,而是表示除了第2行,都打印。也就是说,!是对前面取非,而不是对后面取非。

原文地址:https://www.cnblogs.com/nzbbody/p/4420213.html