sed命令的功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大,sed全称是:Stream EDitor.
sed命令
流程: 从标准输入或文件中读入,一行一行读,读完以后处理,处理完一行后继续读下一行。
sed有两个空间,相当于缓冲,一个是pattern space,一个是hold space,pattern space是一个临时缓冲区,每次读入新行都会覆盖掉里面的内容;hold space相当于一个永久缓冲区,处理结束到读入下一行这期间内容不会被清除。但是处理流程可能会对两个缓冲区的内容造成影响。
几个参数:
d:清除pattern space的内容;
x:交换pattern space和hold space的内容;
g: 将hold space 的内容拷贝并覆盖到pattern space中,hold space自身保持不变;
G: 将hold space 的内容拷贝并追加到pattern space中,hold space自身保持不变;
h:将pattern space 的内容拷贝并覆盖到hold space中,pattern space自身保持不变;
H:将pattern space 的内容拷贝并追加到hold space中,pattern space自身保持不变;
具体处理流程:
读入一行,去掉行尾的换行符后插入到pattern space中,处理,处理结束后输出pattern space的内容,再输出一个换行符。hold space在初始化的时候就含有一个换行符。为了方便理解,我们可以将换行符标记为/n。下面结合具体的实例来介绍sed的处理过程:
以text.txt做实验,内容如下(三行,分别为one,two和three):
$ cat test.txtonetwothree
命令: sed "H;g" test.txt
处理过程如下:
①读入第一行,并插入pattern space,此时两个缓冲区内容如下:
pattern space hold space------------- ---------------one /n <---hold space原来就有一个空行
执行命令H(将pattern space 内容追加到hold space ),此时两个缓冲内容:
pattern space hold space------------- ---------------one /n one
执行命令g(将hold space内容拷贝到pattern space中):
pattern space hold space------------- ---------------/n /none one
执行完毕,输出pattern space的内容:
<--空行one <---输出one后,sed会输出一个回车(不是空行),下次输出在one的下一行
② 处理完毕,读入第二行,并插入到pattern space中,此时(注意hold space的内容不会自动清除):
pattern space hold space------------- ---------------two /n one
执行命令H(将pattern space 内容追加到hold space ),此时两个缓冲内容:
pattern space hold space------------- ---------------two /n one two
执行命令g后缓冲内容:
pattern space hold space------------- ---------------/n /none onetwo two
执行完毕,输出pattern space的内容:
<--空行onetwo
到目前为止,屏幕的总的输出是:
<--空行one <--空行onetwo
③ 读入第三行后:
pattern space hold space------------- ---------------three /n one two
执行命令H后:
pattern space hold space------------- ---------------three /n one two three
执行命令g后:
pattern space hold space------------- ---------------/n /none onetwo twothree three
处理结束输出pattern space的内容:
/n <--空行onetwothree
整个命令处理完后,屏幕的输出是:
$ sed 'H;g' test.txt/n <--空行one/n <--空行onetwo/n <--空行onetwothree$ <---这是linux命令提示符