sed文本编辑器基础用法和案例
一、工作流程
sed的工作流程分为三个过程:
- 读取
- sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区域中(又称为模式空间 pattern space)
- 执行
- 默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令会依次对所有行进行执行。
- 显示
- 发送默认修改后的内容输出流。在发送数据后,模式空间会被清空。在所有的文件内容都准备处理完成之后,上述过程将重复进行,知道所有行完成命令。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件本身并不会发生改变,除非使用重定向存储输出。
二、常用命令
命令 | 描述 |
---|---|
n | 读取下一行输入到模式空间 |
N | 追加下一行输入到模式空间 |
h | 复制模式空间到保持空间 |
H | 追加模式空间到保持空间 |
g | 复制保持空间到模式空间 |
G | 追加保持空间到模式空间 |
x | 交换模式空间和保持空间内容 |
p | 打印当前模式空间 |
P | 打印模式空间的第一行 |
d | 删除模式空间,开始下一个循环 |
D | 删除模式空间的第一行,开始下一个循环 |
y | 转换文本 |
c | 所选行替换新文本 |
a | 当前行追加文本 |
i | 当前行上面插入文本 |
三、示例用法
复制一个文本文件用作示例
[root@localhost ~]# cat test
version=RHEL8
# Use graphical install
graphical
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream
%packages
@^minimal-environment
%end
# Keyboard layouts
keyboard --xlayouts='us'
# System language
lang en_US.UTF-8
1. p
打印匹配#开头的行
[root@localhost ~]# sed -n '/^#/p' test
# Use graphical install
# Keyboard layouts
# System language
打印第一行至第三行
[root@localhost ~]# sed -n '1,3p' test
version=RHEL8
# Use graphical install
graphical
打印匹配行及后一行
[root@localhost ~]# sed -n '/#/,+1p' test
# Use graphical install
graphical
# Keyboard layouts
keyboard --xlayouts='us'
# System language
lang en_US.UTF-8
打印最后一行
[root@localhost ~]# sed -n '$p' test
//最后一行为空
加感叹号对后面的命令取反
2. d
删除与打印使用方法类似
[root@localhost ~]# sed '/#/d' test
version=RHEL8
graphical
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream
%packages
@^minimal-environment
%end
keyboard --xlayouts='us'
lang en_US.UTF-8
[root@localhost ~]# sed '1d' test
# Use graphical install
graphical
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream
%packages
@^minimal-environment
%end
# Keyboard layouts
keyboard --xlayouts='us'
# System language
lang en_US.UTF-8
[root@localhost ~]# sed '1~2d' test
# Use graphical install
@^minimal-environment
%end
# Keyboard layouts
# System language
[root@localhost ~]# sed '1,3d' test
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream
%packages
@^minimal-environment
%end
# Keyboard layouts
keyboard --xlayouts='us'
# System language
lang en_US.UTF-8
打印是把匹配的打印出来,删除是把匹配的删除,删除只是不用-n 选项
3. a、i、c
在#上一行添加 test
[root@localhost ~]# sed '/#/i \test' test
version=RHEL8
test
# Use graphical install
graphical
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream
%packages
@^minimal-environment
%end
test
# Keyboard layouts
keyboard --xlayouts='us'
test
# System language
lang en_US.UTF-8
在#下一行添加test
[root@localhost ~]# sed '/#/a \test' test
version=RHEL8
# Use graphical install
test
graphical
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream
%packages
@^minimal-environment
%end
# Keyboard layouts
test
keyboard --xlayouts='us'
# System language
test
lang en_US.UTF-8
将#替换新行
[root@localhost ~]# sed '/#/c \test' test
version=RHEL8
test
graphical
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream
%packages
@^minimal-environment
%end
test
keyboard --xlayouts='us'
test
lang en_US.UTF-8
4. n、N
打印匹配的下一行
[root@localhost ~]# seq 5 |sed -n '/3/{n;p}'
4
打印偶数
[root@localhost ~]# seq 6 |sed -n 'n;p'
2
4
6
5. P、D
打印和删除模式空间第一行
打印奇数
[root@localhost ~]# seq 6 |sed -n 'N;P'
1
3
5
保留最后一行
[root@localhost ~]# seq 6 |sed 'N;D'
6
读取第一行 1,执行 N 命令读取下一行并追加到模式空间,此时模式空间是 1\n2,执行 D 命令删除 模式空间第一行 1,剩余 2。 读取第二行,执行 N 命令,此时模式空间是 3\n4,执行 D 命令删除模式空间第一行 3,剩余 4。 以此类推,读取最后一行打印时,而 N 获取不到下一行则退出,不再执行 D,因此模式空间只剩余 6 就打印。
6. h、H、g、G、x
- h 复制模式空间内容到保持空间(覆盖)。
- H 复制模式空间内容追加到保持空间。
- g 复制保持空间内容到模式空间(覆盖)。
- G 复制保持空间内容追加到模式空间。
- x 模式空间与保持空间内容互换。
将匹配的内容覆盖到另一个匹配
[root@localhost ~]# seq 6 |sed -e '/3/{h;d}' -e '/5/g'
1
2
4
3
6
h 命令把匹配的 3 复制到保持空间,d 命令删除模式空间的 3。后面命令再对模式空间匹配 5,并用 g 命令把保持空间 3 覆盖模式空间 5。
将匹配的内容放到最后
[root@localhost ~]# seq 6 |sed -e '/3/{h;d}' -e '$G'
1
2
4
5
6
3
交换模式空间和保持空间
[root@localhost ~]# seq 6 |sed -e '/3/{h;d}' -e '/5/x' -e '$G'
1
2
4
3
6
5
在模式空间匹配 5 并将保持空间的 3 与 5 交换,5 就变成了 3,。最后把保持空间的 5 追加到模式空间的。