SED之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holdingspace)这2个空间的使用。
sed编辑器逐行处理文件,并将输出结果打印到屏幕上。sed命令将当前处理的行读入模式空间(pattern space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。处理完文件的最后一行,sed便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明-i选项。
sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“保持空间(hold space)这2个空间的使用。
模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理,用于处理文本行。
保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域,用于保留文本行,是保存已经处理过的输入行,默认有一个空行。
与模式空间和暂存空间(hold space)相关的命令:
n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。
N 读入下一行,追加到模式空间行后面,此时模式空间有两行。
h 把模式空间的内容复制到保留空间,覆盖模式
H 把模式空间的内容追加到保留空间,追加模式
g 把保留空间的内容复制到模式空间,覆盖模式
G 把保留空间的内容追加到模式空间,追加模式
x 将暂存空间的内容于模式空间里的当前行互换。
! 对所选行以外的所有行应用命令。
注意:暂存空间里默认存储一个空行。
一些例子:
cat datafile
111111111111 aaa
222222222222 bbb
333333333333 ccc
444444444444 ddd
555555555555 eee
666666666666 fff
在每行后面加一空行:
sed ‘G‘ datafile
111111111111 aaa
222222222222 bbb
333333333333 ccc
444444444444 ddd
555555555555 eee
666666666666 fff
aaa行被读入模式空间,执行G,在此行后面追加一个空行,然后打印模式空间,其他行同理。
sed ‘/ccc/G‘ datdafile
111111111111 aaa
222222222222 bbb
333333333333 ccc
444444444444 ddd
555555555555 eee
666666666666 fff
删除偶数行:
sed ‘{n;d;}‘ datafile
111111111111 aaa
333333333333 ccc
555555555555 eee
执行n后打印第一行,然后读入第二行执行d命令,即删除此行;然后在执行n打印第三行,然后读入第四行执行d命令,
在偶数行后添加一新行:
sed ‘{n;G;}‘ datafile
111111111111 aaa
222222222222 bbb
333333333333 ccc
444444444444 ddd
555555555555 eee
666666666666 fff
执行 n 以后将第一行输出到标准输出以后,然后第二行进入模式空间,根据前面对 G 的解释,会在第二行后面插入一个空行,然后输出;再执行 n 将第三行输出到标准输出,然后第四行进入模式空间,并插入空行,依此类推。
相应的:sed ‘{n;n;G;}‘ datafile 表示在文件的第 3,6,9,12,… 行后面插入一个空行。
将偶数行置空:
sed ‘{n;g;}‘ datafile
111111111111 aaa
333333333333 ccc
555555555555 eee
执行n后打印第一行,然后读入第二行执行g命令,g命令用暂存空间内容(null)来替换当前模式空间,即第二行被置空。其它行依此类推。
输出文件最后2行,相当于 tail -2 datafile
sed ‘{$!N;$!d;}‘ datafile
555555555555 eee
666666666666 fff
sed ‘{$!N;$!d;}‘ : 对文件倒数第二行以前的行来说,N 将当前行的下一行追加到模式空间中以后,D 就将模式空间的内容删除了;到倒数第二行的时候,将最后一行追加到倒数第二行下面,然后最后一行不执行 d(!对所选行-此处是最后一行,以外的行执行命令) ,所以文件的最后两行都保存下来了。
将文件的行反序显示,相当于 tac 命令:
本文出自 “12336320” 博客,请务必保留此出处http://12346320.blog.51cto.com/12336320/1891850
原文:http://12346320.blog.51cto.com/12336320/1891850