sed流编辑器的工作原理
sed是一款流编辑器,它以行为单位对输入的文本进行编辑操作,将编辑结果标准输出至屏幕,而不修改原文件。
如下图所示,sed将文本以行为单位,传递至模式空间,然后根据已给出的script操作命令,对模式空间中的内容进行增、删、替换、打印等操作,然后将模式空间中的内容输出至标准输出。至此,结束了一行的编辑,再从文本中读取下一行,再进行上面的操作。
除了模式空间外,sed流编辑器还存在一个空间,叫保留空间。它和模式空间一样可以存储文本,可以和模式空间进行内容的传递、交换,从而达到很多奇特的功能,下面将有所解释。
图解sed流编辑器工作原理:
以流程图的形式,描述sed流编辑器的工作过程:
地址定界
前面讲到,sed是以行为单位对文本进行编辑的,但有时候我们并不需要对文本中的所有内容进行编辑,这时候就需要使用到地址定界了。
地址定界的三种情况:
1、空地址:对全文进行处理。
2、单地址:
#:指定行。
[root@localhost ~]# cat -n fstab |sed -n '3p' 3 # /etc/fstab
/parttern/:被此模式所匹配到的每一行,默认支持glob模式。
[root@localhost ~]# cat -n fstab |sed -n '/filesystems/p' 6 # Accessible filesystems, by reference, are maintained under '/dev/disk'
3、地址范围:
#1,#2:指定从第#1行到第#2行这个范围内的文本。
[root@localhost ~]# cat -n fstab |sed -n '2,4p' 2 # 3 # /etc/fstab 4 # Created by anaconda on Mon Mar 6 21:17:53 2017
#1,+#2:从第#1行开始,并向下延拓#2行,共#2+1行。
[root@localhost ~]# cat -n fstab |sed -n '2,+2p' 2 # 3 # /etc/fstab 4 # Created by anaconda on Mon Mar 6 21:17:53 2017
#,/part/:从第#行开始,到第一个被模式part匹配到的行结束。
[root@localhost ~]# cat -n fstab |sed -n '9,/UUID/p' 9 /dev/mapper/centos-root / xfs defaults 0 0 10 UUID=3b58e5e9-38a2-49f1-990b-3370489ff305 /boot xfs defaults 0 0
- /part1/,/part2/:从被模式part1匹配到的行开始,到被模式part2匹配到的行结束。
- $:最后一行。
4、步进:~(波浪形前的数字表示起始行,波浪线后的数字表示步进长度)
- 1~2:所有奇数行。
2~2:所有偶数行。
[root@localhost ~]# cat -n fstab |sed -n '1~2p' 1 3 # /etc/fstab 5 # 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 9 /dev/mapper/centos-root / xfs defaults 0 0 11 /dev/mapper/centos-home /home xfs defaults 0 0 13 /dev/sr0 /media/cdrom iso9660 defaults 0 0
通过查看man手册,可以得到sed的使用命令格式:
SYNPPSIS: sed [OPTION]… {script-only-if-no-other-script} [input-file]…
接下来,我将分别介绍sed命令中的命令选项OPTIONS和编辑命令/script,让大家了解如何使用sed编辑文本。
常用选项
首先,贴出常用的sed命令选项:
常用选项 | 选项作用 |
---|---|
-n | 不输出模式空间中的内容至屏幕 |
-e script,–expression=script | 多点编辑 |
-f script-file,–file=script-file | 使用脚本文件进行编辑操作 |
-r,–regexp-extended | 支持使用扩展正则表达式 |
-i[SUFFIX],–in-plaxe[=SUFFIX] | 直接编辑原文件 |
常用编辑命令
常用编辑命令一览表:
编辑命令 | 命令作用 |
---|---|
d | 删除 |
p | 显示 |
a \text | 在行后面追加文本“text”,支持使用\n实现多行追加 |
i \text | 在行前面插入文本“text”,支持使用\n实现多行追加 |
c \text | 把匹配到的行替换为此处指定的文本“text” |
w /PATH/TO/SOMEFILE | 保留模式空间匹配到的行至指定的文件中 |
r/PATH/FORM/SOMEFILE | 读取指定文件的内容至当前文件被模式匹配到的行后面;文本合并 |
= | 为模式匹配到的行打印行号 |
! | 条件取反 |
s/// | 查找替换,其分隔符可自行指定,常用的由s@@@,s###等 |
在模式空间和保持空间中进行各种传递交换内容的编辑命令:
编辑命令 | 命令作用 |
---|---|
h | 把模式空间中的内容覆盖至保持空间中 |
H | 把模式空间中的内容追加至保存空间中 |
g | 把保持空间中的内容覆盖至模式空间中 |
G | 把保持空间中的内容追加至模式空间中 |
x | 把模式空间中的内容与保持空间中的内容互换 |
n | 覆盖读取匹配到的行的下一行至模式空间中 |
N | 追加读取匹配到的行的下一行至模式空间中 |
d | 删除模式空间中的所有行 |
D | 删除多行模式空间中的所有行 |
部分编辑命令详解:
d:删除当前编辑的行
删除地址定界范围内的行:
[root@localhost ~]# cat -n fstab |sed '4,$d'
1
2 #
3 # /etc/fstab
p:显示模式空间中的内容
默认模式空间中的内容在编辑结束后会被打印,若再对匹配到的行进行“p”操作,则将被打印两次。如下:
[root@localhost ~]# cat -n fstab |sed '1,3p'
1
1
2 #
2 #
3 # /etc/fstab
3 # /etc/fstab
4 # Created by anaconda on Mon Mar 6 21:17:53 2017
5 #
6 # Accessible filesystems, by reference, are maintained under '/dev/disk'
...省略更多...
所以,“p”编辑操作常与“-n”选项一同使用。(“-n”选项的作用是取消默认打印模式空间内容这一操作),如下:
[root@localhost ~]# cat -n fstab |sed -n '1,3p'
1
2 #
3 # /etc/fstab
a \text:在被匹配的行后追加文本“text”,支持使用\n实现多行追加
[root@localhost ~]# cat -n fstab |sed '2a \This is a new line\nThis is another new line'
1
2 #
This is a new line
This is another new line
3 # /etc/fstab
i \text:在行前面插入文本“text”,支持使用\n实现多行插入
[root@localhost ~]# cat -n fstab |sed '2i \This is a new line\nThis is another new line'
1
This is a new line
This is another new line
2 #
3 # /etc/fstab
c \text:把匹配到的行替换为此处指定的文本“text”,支持使用\n替换成多行
[root@localhost ~]# cat -n fstab |sed '3c \This is a new line\nThis is another new line'
1
2 #
This is a new line
This is another new line
4 # Created by anaconda on Mon Mar 6 21:17:53 2017
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面,可实现文件合并
=:为模式匹配到的行打印行号
行号位于该行前,且独占一行。
[root@localhost ~]# cat -n fstab |sed '='
1
1
2
2 #
3
3 # /etc/fstab
4
4 # Created by anaconda on Mon Mar 6 21:17:53 2017
5
5 #
!:条件取反
匹配到的行不执行打印操作,对未匹配到的行执行匹配操作。
[root@localhost ~]# cat -n fstab |sed -n '1,10!p'
11 /dev/mapper/centos-home /home xfs defaults 0 0
12 /dev/mapper/centos-swap swap swap defaults 0 0
13 /dev/sr0 /media/cdrom iso9660 defaults 0 0
s///:查找替换,与vim中末行模式相同,其分隔符可自行自定,常用的有s@@@,s###。其中,查找常用的修饰符有:
- g:全局替换;
- w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
- p:显示替换成功的行;
示例:替换文本并打印:
[root@localhost ~]# cat -n fstab |sed -n 's@fstab@FSTAB@p'
3 # /etc/FSTAB
7 # See man pages FSTAB(5), findfs(8), mount(8) and/or blkid(8) for more info