sed高级命令

1.命令选项

  • P:打印模式空间开端至\n内容,并追加到默认输出之前
  • h: 把模式空间中的内容覆盖至保持空间中
  • H:把模式空间中的内容追加至保持空间中
  • g: 从保持空间取出数据覆盖至模式空间
  • G:从保持空间取出内容追加至模式空间
  • x: 把模式空间中的内容与保持空间中的内容进行互换
  • n: 读取匹配到的行的下一行覆盖至模式空间,打印模式空间的值,并读取下一行。
  • N:读取匹配到的行的下一行追加至模式空间,它不打印模式空间的值
  • d: 删除模式空间中的行
  • D:如果模式空间包含换行符,则删除直到第一个换行符的模

2.多行操作命令(N、n)

N:将下一行添加到模式空间中。将当前读入行和用N命令添加的下一行看成“一行”。

//将匹配的行与下一行之间的换行符\n替换为空
[root@slave ~]# cat test 
ignoredisk --only-use=nvme0n1
clearpart --none --initlabel
Use CDROM installation media
keyboard --vckeymap=cn --xlayouts='cn'
[root@slave ~]# sed '/nvme0n1/N;s/\n//' test 
ignoredisk --only-use=nvme0n1clearpart --none --initlabel
Use CDROM installation media
keyboard --vckeymap=cn --xlayouts='cn'

//将匹配的行和下一行加入模式空间,打印第一行
[root@slave ~]# cat test 
ignoredisk --only-use=nvme0n1
clearpart --none --initlabel
Use CDROM installation media
keyboard --vckeymap=cn --xlayouts='cn'
[root@slave ~]# sed -n '/ignoredisk/{N;P}' test 
ignoredisk --only-use=nvme0n1

n:读取下一行到模式空间。由于模式空间中有按照正常流程读取的内容,使用n命令后,模式空间中又有了一行,此时,模式空间中有2行内容,但是先读取的那一行不会被取代、覆盖或删除;当n命令后,还有其他命令p的时候,此时打印出的结果是n命令读取的那一行的内容(第二行内容)。

[root@slave ~]# cat test 
ignoredisk --only-use=nvme0n1
clearpart --none --initlabel
Use CDROM installation media
keyboard --vckeymap=cn --xlayouts='cn'
[root@slave ~]# sed -n '/ignoredisk/{n;P}' test 
clearpart --none --initlabel

3.删除命令(D、d)

D:删除模式空间中第一行的内容,也就是说,D 命令将模式空间中第一个换行符(包括换行符)之前的内容删除掉。

//匹配空行,用N把下一行加入模式空间,如果模式空间有nvme0n1内容,则删除模式空间的第一行
[root@slave ~]# cat test 

ignoredisk --only-use=nvme0n1
clearpart --none --initlabel
Use CDROM installation media
keyboard --vckeymap=cn --xlayouts='cn'
[root@slave ~]# sed '/^$/{N;/nvme0n1/D}' test 
ignoredisk --only-use=nvme0n1
clearpart --none --initlabel
Use CDROM installation media
keyboard --vckeymap=cn --xlayouts='cn'

//匹配空行,N将下一行加入模式空间,如果下一行也是空行,则删除第一行空行(这样可以保证不为空行的行之间都有一个空行。而不能使用d,因为d是删除模式空间所有内容,如果空行为偶数的话就会删除全部空行)
[root@slave ~]# cat test 
ignoredisk --only-use=nvme0n1


clearpart --none --initlabel



Use CDROM installation media




keyboard --vckeymap=cn --xlayouts='cn'
[root@slave ~]# sed '/^$/{N;/^\n$/D}' test 
ignoredisk --only-use=nvme0n1

clearpart --none --initlabel

Use CDROM installation media

keyboard --vckeymap=cn --xlayouts='cn'

d:删除模式空间的所有内容

//匹配空行,用N把下一行加入模式空间,如果模式空间有nvme0n1内容,则删除模式空间所有内容
[root@slave ~]# cat test 

ignoredisk --only-use=nvme0n1
clearpart --none --initlabel
Use CDROM installation media
keyboard --vckeymap=cn --xlayouts='cn'
[root@slave ~]# sed '/^$/{N;/nvme0n1/d}' test 
clearpart --none --initlabel
Use CDROM installation media
keyboard --vckeymap=cn --xlayouts='cn'

4.打印命令(P、p)

P:仅打印模式空间的第一行内容
p:打印所有的内容

因为编辑命令全部执行完之后,sed默认会输出模式空间的内容,所以一般情况下,p和P命令都是与-n选项一起使用的

[root@slave ~]# cat test1
line1
line2
line3
//匹配到的行(line1)加入模式空间,N将下一行(line2)加入模式空间,P打印第一行(line1),sed语句自动输出模式空间的内容(line1、line2)
[root@slave ~]# sed '/.*/N;P' test1
line1
line1
line2
line3
//匹配到的行(line1)加入模式空间,N将下一行(line2)加入模式空间,P打印第一行(line1),D删除第一行(line1),sed语句自动输出模式空间的内容(line2) (最后匹配line3,没有下一行直接打印)
[root@slave ~]# sed '/.*/N;P;D' test1
line1
line2
line3
//匹配(line1)加入模式空间,N将下一行(line2)加入模式空间,P打印第一行(line1),d删除所有行(line1、line2),最后匹配(line3,没有下一行直接打印,然后删除模式空间内容)
[root@slave ~]# sed '/.*/N;P;d' test1
line1
line3

//匹配(line1)加入模式空间,N将下一行(line2)加入模式空间,P打印全部内容(line1、line2)
[root@slave ~]# cat test1
line1
line2
line3
[root@slave ~]# sed '/.*/N;p' test1
line1
line2
line1
line2
line3

大小写转换:y

[root@slave ~]# cat sed 
/l/{
y/l/L/
}
[root@slave ~]# sed -f sed test1
Linux
mysqL

h、G

[root@slave ~]# cat test1
1
2
11
22
[root@slave ~]# sed '/1/{h;d};/2/G' test1
2
1
22
11
[root@slave ~]# cat test1
1
2
11
22
[root@slave ~]# sed '/1/h;/2/H;g' test1
1
1
2
11
11
22

x:将模式空间和保持空间内容进行交换

[root@slave ~]# cat test1
1
2
11
22
[root@slave ~]# sed '/1/h;/2/x;p' test1
1
1
1
1
11
11
11
11

5.高级的流控命令(b)

分支命令格式:
Branch命令用于在脚本中将控制流转到另一行。

[address]    [label]

address:决定在哪行或哪些行执行分支命令
label:参数定义于何处分支
[root@ansible ~]# cat test02
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.

[root@ansible ~]# sed '{2,3b ; s/This is/Is this/ ; s/line./test?/}' test02
Is this the header test?
This is the first data line.
This is the second data line.
Is this the last test?



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值