`

SED的暂存空间和模式空间

 
阅读更多

SED之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holdingspace)这2个空间的使用。

 

 

sed编辑器逐行处理文件,并将输出结果打印到屏幕上。sed命令将当前处理的行读入模式空间(pattern space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。处理完文件的最后一行,sed便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明-i选项。

与模式空间和暂存空间(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' datafile
111111111111 aaa
222222222222 bbb
333333333333 ccc

444444444444 ddd
555555555555 eee
666666666666 fff

在匹配行前加入一个空行:

sed '/ccc/{x;p;x;}' datafile
111111111111 aaa
222222222222 bbb

333333333333 ccc
444444444444 ddd
555555555555 eee
666666666666 fff

命令执行前后暂存空间和模式空间的变化情况:

命令     暂存空间                                         模式空间
x           执行前:null 执行后:ccc\n              执行前:ccc\n 执行后:null
p          执行前:null 执行后:ccc\n              执行前:ccc\n 执行后:null 输出一个空行
x          执行前:ccc\n 执行后:null              执行前:null 执行后:ccc\n 输出ccc所在行

(注:把ccc所在行简写为ccc)

删除偶数行:

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)来替换当前模式空间,即第二行被置空。其它行依此类推。

合并偶数行到上一行:

sed '{N;s/\n/\t/;}' datafile
111111111111 aaa 222222222222 bbb
333333333333 ccc 444444444444 ddd
555555555555 eee 666666666666 fff

执行N,将第二行追加到模式空间的第一行后,此时模式空间用两行,然后执行替换(s)将第一个换行符替换成tab。其它行依此类推。

加行号,大致相当于cat -n datafile:

sed = datafile
1
111111111111 aaa
2
222222222222 bbb
3
333333333333 ccc
4
444444444444 ddd
5
555555555555 eee
6
666666666666 fff

sed = datafile |sed '{N;s/\n/\t/;}'
1 111111111111 aaa
2 222222222222 bbb
3 333333333333 ccc
4 444444444444 ddd
5 555555555555 eee
6 666666666666 fff

输出文件最后2行,相当于 tail -2 datafile

sed '{$!N;$!d;}' datafile
555555555555 eee
666666666666 fff

sed '{$!N;$!d;}' : 对文件倒数第二行以前的行来说,N 将当前行的下一行追加到模式空间中以后,D 就将模式空间的内容删除了;到倒数第二行的时候,将最后一行追加到倒数第二行下面,然后最后一行不执行 d(!对所选行-此处是最后一行,以外的行执行命令) ,所以文件的最后两行都保存下来了。

将文件的行反序显示,相当于 tac 命令:

sed '{1!G;h;$!d;}' datafile
666666666666 fff
555555555555 eee
444444444444 ddd
333333333333 ccc
222222222222 bbb
111111111111 aaa

1!G表示除了第一行以外,其余行都执行G命令;$!d表示除了最后一行以外,其余行都执行d命令。

看一下sed '{1!G;h;$!d;}'命令执行过程中暂存空间与模式空间的变化:

处理行        命令         暂存空间                                                                          模式空间
第一行        h;d           执行前:null 执行后:aaa\n                                             执行前:aaa\n 执行后:null
第二行        G;h;d       执行前:aaa 执行后:bbb\n1111\n                                 执行前:bbb\n 执行后:null
最后一行    G;h          执行前:eee\n…aaa\n 执行后:fff\n…bbb\n\aaa\n       执行前:eee\n 执行后:fff\n…bbb\n\aaa\n


分享到:
评论
1 楼 SuperCustomer 2015-01-20  

相关推荐

    sed模式空间和暂存空间的区别

    `sed` 是一款强大的流...理解并熟练运用模式空间和暂存空间是掌握 `sed` 编辑器的关键,它们能帮助我们执行复杂的数据处理任务,而无需编写完整的程序。通过这些命令,可以创建灵活的文本处理脚本,以满足各种需求。

    通过几个例子看sed的模式空间与保持空间.pdf

    sed 处理文件时,会把文件的每一...因此可把模式空间内容用命令h复制并保存在一个暂存缓冲区(holding buffer 保持空间)内,然后可用命令G把它从暂存缓冲区读出,并放回模式空间缓冲区,追加在模式空间内当前行的后面。

    sed命令详解

    - **h**:将模式空间的内容复制到暂存缓冲区。 - **H**:将模式空间的内容追加到暂存缓冲区。 - **g**:将暂存缓冲区的内容复制到模式空间。 - **G**:将暂存缓冲区的内容追加到模式空间。 - **l**:列出非打印字符...

    sed&awk101 Hacks

    保持空间和模式空间命令部分,介绍了如何在sed中使用保持空间来暂存模式空间的内容,以及如何将这些内容用于进一步处理。sed多行模式及循环部分,讲解了sed处理多行文本的能力,包括读取下一行数据附加到模式空间的...

    sed用法实例指导DOC版

    - 暂存区:当使用`t`命令跳转或`n`命令读取下一行时,当前模式空间的内容会被移动到暂存区。 4. **流编辑流程:** - 读取一行数据。 - 应用地址和命令。 - 如果有`d`命令,跳过剩余流程,进入下一行。 - 默认...

    sed命令.docx

    - `G`:在模式空间内容后面追加暂存缓冲区的内容。 - `l`:列出非打印字符。 - `p`:打印当前行。 - `n`:读取下一行并开始处理。 - `q`:结束sed进程。 - `r`:从其他文件读取输入行。 - `!`:对选定行之外的所有行...

    GNU sed manual说明书

    sed内部有保持缓冲区(hold buffer)和模式空间(pattern space),它们用于在处理文本流时暂存文本。通过D、G、H、N和P等命令可以实现多行技术,处理跨越多行的文本。 在流控制方面,GNU sed提供了分支命令,允许...

    sed命令详解.docx

    - `x`:交换模式空间和暂存缓冲区的内容。 - `y`:字符替换。 选项方面,`-e`用于执行多条sed命令,`-n`取消默认的输出,`-f`指定包含sed脚本的文件。 **4. 正则表达式** sed使用正则表达式进行模式匹配和替换。它...

    linux下sed的用法

    - `x`:交换模式空间和暂存缓冲区的内容。 - `y`:字符替换。 选项`-e`允许你执行多项编辑,`-n`取消默认的输出,`-f`指定包含`sed`脚本的文件名。 **3. 正则表达式** `sed`使用正则表达式进行匹配和替换,正则...

    ASPAC-SED.rar_sed

    - **模式空间**:SED在内存中维护一个模式空间,保存当前处理的行。 - **缓冲区**:默认情况下,所有修改都会暂存于缓冲区,直到遇到`w`命令写入文件,或程序结束才输出。 - **命令链**:在同一命令中可以使用分号`;...

    SED单行脚本快速参考(流编辑器)第1/2页

    - **暂存缓冲区(hold space)**:用于存储临时数据。 当`sed`启动时,它会将文件的第一行加载到模式空间中,执行预定义的编辑命令,并将结果输出到屏幕上。接下来,它会读取文件的下一行,替换模式空间中的内容,并...

    常用的shell命令.pptx

    7. **git commit**: 提交暂存区的更改。 8. **git tag**: 创建标签。 9. **git merge**: 合并分支。 10. **git symbolic-ref**: 创建软链接引用,常用于设置HEAD。 11. **SourceTree**: 一个图形化的Git客户端工具。...

    Linux指令一周通 (技术图书大系).azw3

    1.50 mktemp指令:建立暂存文件 1.51 more指令:显示文件信息 1.52 mmove指令:移动或重命名MS-DOS文件 1.53 mread指令:复制MS-DOS文件 1.54 mren指令:移动或重命名MS-DOS文件 1.55 mshowfat指令:显示MS-DOS文件...

Global site tag (gtag.js) - Google Analytics