linux sed 命令解释

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命令提示符

你可能感兴趣的:(Unix/Linux,系统)