sed文本编辑器基础用法和案例

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

  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 并将保持空间的 3 与 5 交换,5 就变成了 3,。最后把保持空间的 5 追加到模式空间的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值