sed进阶用法
pattern space(模式空间)and hold space (保持空间)
(H、h、G、g、x)
模式空间:sed处理文本内容行的一个临时缓冲区,模式空间中的内容会主动打印到标准输出,并自动清空模式空间
保持空间:sed处理文本内容行的另一个临时缓冲区,不同的是保持空间内容不会主动清空,也不会主动打印到标准输出,而是需要sed命令来进行处理
模式空间与保持空间的关系
模式空间:相当于流水线,文本行再模式空间中进行处理;
保持空间:相当于仓库,在模式空间对数据进行处理时,可以把数据临时存储到保持空间;作为模式空间的一个辅助临时缓冲区,但又是相互独立,可以进行交互,命令可以寻址模式空间但是不能寻址保持空间。可以使用高级命令h,H,g,G与模式空间进行交互。
sed [- option]
-n 使用安静模式.则只有经过sed特殊处理的哪一行才会显示出来
-f file 从指定文件中读取编辑脚本
-r 支持使用拓展的正则表达式
-i 直接修改文件(替换原文件)
基本用法
- n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令(这里的n不是sed -n)
[root@localhost practise]# cat 123
1
2
3
4
5
6
[root@localhost practise]# sed -n '2n;p' 123 # -n取消自动打印模式空间(取消默认的输出,不输出到屏幕)
1
3
4
5
6
#在循环到文件第二行的时候跳过然后读入第三行打印,后面的依次打印,因为2n代表的是在读入文件
#第二行的时候才执行n命令,其余行的时候都是正常执行打印操作
- N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码,追加匹配到的行的下一行至模式空间
[root@localhost practise]# cat 123
1
2
3
4
5
6
[root@localhost practise]# sed -n 'N;p' 123
1
2
3
4
5
6
- a在当前行下面插入文本
[root@localhost practise]# cat 123
1
2
3
[root@localhost practise]# sed '3a4' 123 #在第三行下面添加4
1
2
3
4
- i在当前行上面插入文本
[root@localhost practise]# cat 123
1
2
3
[root@localhost practise]# sed '3inmd' 123 #在第三行插入nmd
1
2
nmd
3
- c把选定的行改为新的文本
[root@localhost practise]# cat 123
1
2
3
[root@localhost practise]# sed '2ctwo' 123 #将第二行修改成two
1
two
3
[root@localhost practise]# sed '/2/ctwo' 123 #将匹配到的参数修改成two
1
two
3
- y表示把一个字符翻译为另外的字符,替换字符和被替换字符长度要一样(但是不用于正则表达式)
[root@localhost practise]# cat 123
1
2
3
[root@localhost practise]# sed 'y/1/0/' 123 #将1替换成0
0
2
3
- d删除,删除选择的行
[root@localhost practise]# cat 123
one
2
3
[root@localhost practise]# sed '2d' 123 #将第二行删除
one
3
[root@localhost practise]# sed '/3/d' 123 #将匹配到的参数删除
one
2
高级编辑命令
h:把模式空间中的内容复制(覆盖)到保持空间中
H:把模式空间中的内容追加到保持空间中
g:从保持空间中取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容和保持空间中的内容进行互换
n:读取匹配到的行的下一行至模式空间
N:追加匹配到的行的下一行至模式空间
d:删除模式空间中的行
D:删除多行模式空间中的所有行
p :打印当前模式空间内容,一般一行会显示两次,sed后面加上-n就不会了,通常 p 会与参数 sed -n 一起使用
P:打印当前模式空间开端至\n的内容,并追加到默认输出之前
[root@localhost practise]# cat 123
1
2
3
//将1复制到保持空间,匹配到3时将保持空间的内容追加到模式空间
[root@localhost practise]# sed '/1/{h};/3/{G}' 123
1
2
3
1
//将1追加到保持空间,匹配到3时将保持空间的内容追加到模式空间
//有一行空行是因为原本保持空间是空的,所以追加回模式空间就用空行填充了
[root@localhost practise]# sed '/1/{H};/3/{G}' 123
1
2
3
1
//将1复制到保持空间并删除模式空间的1,匹配到2时将保持空间的内容复制到模式空间
//内容为1,3原因是我将1复制到保持空间又删除了,所以保持空间的状态为空,匹配到2时将保持空间的内容复制回模式空间,而保持空间什么都没有,所以输出出来的只有1和3
[root@localhost practise]# sed '/1/{h;d};/2/{g}' 123
1
3
1
//将1复制到保持空间并删除模式空间的1,匹配到2时将保持空间的内容复制到模式空间
//内容为1,3原因是我将1复制到保持空间又删除了,所以保持空间的状态为空,匹配到2时将保持空间的内容复制回模式空间,而保持空间什么都没有,所以输出出来的只有1和3
[root@localhost practise]# sed '/1/{h;d};/2/{g}' 123
1
3