sed文本编辑
sed作用
流编辑器,过滤和替换文本。
- 首先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
打印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
//最后一行为空
删除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 选项
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
n、N
打印匹配的下一行
[root@localhost ~]# seq 5 |sed -n '/3/{n;p}'
4
打印偶数
[root@localhost ~]# seq 6 |sed -n 'n;p'
2
4
6
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 就打印。
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/g’
1
2
4
3
6
h 命令把匹配的 3 复制到保持空间,d 命令删除模式空间的 3。后面命令再对模式空间匹配 5,并用 g 命令把保持空间 3 覆盖模式空间 5。
将匹配的内容放到最后
```bash
[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 追加到模式空间的。