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
分享到:
相关推荐
`sed` 是一款强大的流...理解并熟练运用模式空间和暂存空间是掌握 `sed` 编辑器的关键,它们能帮助我们执行复杂的数据处理任务,而无需编写完整的程序。通过这些命令,可以创建灵活的文本处理脚本,以满足各种需求。
sed 处理文件时,会把文件的每一...因此可把模式空间内容用命令h复制并保存在一个暂存缓冲区(holding buffer 保持空间)内,然后可用命令G把它从暂存缓冲区读出,并放回模式空间缓冲区,追加在模式空间内当前行的后面。
- **h**:将模式空间的内容复制到暂存缓冲区。 - **H**:将模式空间的内容追加到暂存缓冲区。 - **g**:将暂存缓冲区的内容复制到模式空间。 - **G**:将暂存缓冲区的内容追加到模式空间。 - **l**:列出非打印字符...
保持空间和模式空间命令部分,介绍了如何在sed中使用保持空间来暂存模式空间的内容,以及如何将这些内容用于进一步处理。sed多行模式及循环部分,讲解了sed处理多行文本的能力,包括读取下一行数据附加到模式空间的...
- 暂存区:当使用`t`命令跳转或`n`命令读取下一行时,当前模式空间的内容会被移动到暂存区。 4. **流编辑流程:** - 读取一行数据。 - 应用地址和命令。 - 如果有`d`命令,跳过剩余流程,进入下一行。 - 默认...
- `G`:在模式空间内容后面追加暂存缓冲区的内容。 - `l`:列出非打印字符。 - `p`:打印当前行。 - `n`:读取下一行并开始处理。 - `q`:结束sed进程。 - `r`:从其他文件读取输入行。 - `!`:对选定行之外的所有行...
sed内部有保持缓冲区(hold buffer)和模式空间(pattern space),它们用于在处理文本流时暂存文本。通过D、G、H、N和P等命令可以实现多行技术,处理跨越多行的文本。 在流控制方面,GNU sed提供了分支命令,允许...
- `x`:交换模式空间和暂存缓冲区的内容。 - `y`:字符替换。 选项方面,`-e`用于执行多条sed命令,`-n`取消默认的输出,`-f`指定包含sed脚本的文件。 **4. 正则表达式** sed使用正则表达式进行模式匹配和替换。它...
- `x`:交换模式空间和暂存缓冲区的内容。 - `y`:字符替换。 选项`-e`允许你执行多项编辑,`-n`取消默认的输出,`-f`指定包含`sed`脚本的文件名。 **3. 正则表达式** `sed`使用正则表达式进行匹配和替换,正则...
- **模式空间**:SED在内存中维护一个模式空间,保存当前处理的行。 - **缓冲区**:默认情况下,所有修改都会暂存于缓冲区,直到遇到`w`命令写入文件,或程序结束才输出。 - **命令链**:在同一命令中可以使用分号`;...
- **暂存缓冲区(hold space)**:用于存储临时数据。 当`sed`启动时,它会将文件的第一行加载到模式空间中,执行预定义的编辑命令,并将结果输出到屏幕上。接下来,它会读取文件的下一行,替换模式空间中的内容,并...
7. **git commit**: 提交暂存区的更改。 8. **git tag**: 创建标签。 9. **git merge**: 合并分支。 10. **git symbolic-ref**: 创建软链接引用,常用于设置HEAD。 11. **SourceTree**: 一个图形化的Git客户端工具。...
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文件...