sed文本编辑

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

  1. h 复制模式空间内容到保持空间(覆盖)。
  2. H 复制模式空间内容追加到保持空间。
  3. g 复制保持空间内容到模式空间(覆盖)。
  4. G 复制保持空间内容追加到模式空间。
  5. 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 追加到模式空间的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值