sed高级用法
sed高级用法:模式空间与保持空间
模式空间:sed处理文本内容行的一个临时缓冲区,模式空间中的内容会主动打印到标准输出,并自动清空模式空间
保持空间:sed处理文本内容行的另一个临时缓冲区,不同的是保持空间内容不会主动清空,也不会主动打印到标准输出,而是需要sed命令来进行处理
模式空间与保持空间的关系
名称 | 概念 |
---|---|
模式空间(pattern space) | 相当于流水线,文本行在模式空间中进行处理; |
保持空间(hold space) | 相当于仓库,在模式空间对数据进行处理时,可以把数据临时存储到保持空间;作为模式空间的一个辅助临时缓冲区,但又是相互独立,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间。 |
hold:(H|h)(追加|覆盖)到保持空间
get:(G|g)(追加|覆盖)到模式空间
h : 把模式空间中的内容覆盖至保持空间中
H :把模式空间中的内容追加至保持空间中
g : 把保持空间中的内容覆盖至模式空间中
G :把保持空间中的内容追加至模式空间中
n : 读取下一行覆盖模式空间中的行
N :读取下一行并追加到模式空间中的行后面,使用\n分隔
D :删除模式空间的第一行,不读入下一行
d :删除模式空间中的所有行,并读入下一行
N多行命令
多行**Next (N)**命令通过读取新的输入行,并将它添加到模式空间的现有内容之后来创建多行模式空间。模式空间最初的内容和新的输入行之间用换行符分隔。在模式空间中嵌入的换行符可以利用转义序列“\n”来匹配。在多行模式空间中,元字符“^”匹配空间中的第一个字条,而不匹配换行符后面的字符。同样,“$”只匹配模式空间中最后的换行符,而不匹配任何嵌入的换行符。在执行next命令之后,控制将被传递给脚本中的后续命令。
Next命令与next命令不同,next输出模式空间的内容,然后读取新的输入行。next命令不创建多行模式空间。
示例:
- 将第一行与第二行合并为一行
[root@apache ~]# cat abc
hell
o wor
d tom
[root@apache ~]# sed '/hell/N;s/\n//' abc //匹配‘hell’将匹配行与其下一行并入一行放入多行模式空间,将换行替换为空值
hello wor
d tom
- 将三行并为一行
[root@apache ~]# cat abc
hell
o wor
d tom
[root@apache ~]# sed '/hell/N;s/\n//;N;s/\n //' abc
hello word tom
- 使用 -f 指定文件
[root@apache ~]# cat abc
hell
o wor
d tom
[root@apache ~]# cat test.sh
/hell/ {
N
s/\n//
}
[root@apache ~]# sed -f test.sh abc
hello wor
d tom
[root@apache ~]# cat abc
hell
o wor
d tom
[root@apache ~]# cat test.sh
/hell/ {
N
s