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.txt
one
two
three
命令:
sed "H;g" test.txt
处理过程如下:
①读入第一行,并插入pattern space,此时两个缓冲区内容如下:
pattern space hold space ------------- --------------- one <---hold space原来就有一个空行执行命令H(将pattern space 内容追加到hold space ),此时两个缓冲内容:
pattern space hold space ------------- --------------- one <--- 空行 one执行命令g(将hold space内容拷贝到pattern space中):
pattern space hold space ------------- --------------- <--- 空行 <--- 空行 one one执行完毕,输出pattern space的内容:
<--空行 one <---输出one后,sed会输出一个回车(不是空行),下次输出在one的下一行② 处理完毕,读入第二行,并插入到pattern space中,此时(注意 hold space的内容不会自动清除):
pattern space hold space ------------- --------------- two <--- 空行 one执行命令H(将pattern space 内容追加到hold space ),此时两个缓冲内容:
pattern space hold space ------------- --------------- two <--- 空行 one two执行命令g后缓冲内容:
pattern space hold space ------------- --------------- <--- 空行 <--- 空行 one one two two执行完毕,输出pattern space的内容:
<--空行 one two到目前为止,屏幕的总的输出是:
<--空行 one <--空行 one two③ 读入第三行后:
pattern space hold space ------------- --------------- three <--- 空行 one two执行命令H后:
pattern space hold space ------------- --------------- three <--- 空行 one two three执行命令g后:
pattern space hold space ------------- --------------- <--- 空行 <--- 空行 one one two two three three处理结束输出pattern space的内容:
<--空行 one two three整个命令处理完后,屏幕的输出是:
$ sed 'H;g' test.txt <--空行 one <--空行 one two <--空行 one two three $ <---这是linux命令提示符