sed高级命令

高级命令分成了3个组:

处理了多行模式空间(N、D、P)。
采用保持空间来保存模式空间的内容并使它可用于后续的命令(H、h、G、g、x) 。 编写使用分支
和条件指令的脚本来更改控制流(b)。

多行模式空间

sed能查看模式空间的多个行,这就是允许匹配模式扩展到多行上,3个多行命令(N、D、P))对应于小 写字母的基本命令(n、d、p)。例如,删除命令(D)是删除命令(d)的多行形式。区别是:d删除模 式空间的内容,D只删除多行模式空间的第一行。

命令功能
Next (N)追加读取匹配到的行的下一行至模式空间中
Delete(D)删除多行模式空间中的首行
Print(P)打印多行组中的一行。
n打印当前模式空间内容,然后读取下一行并替代当前模式空间的内容。如果读取不到下一行sed则会不运行之后的命令
h(hold)将模式空间中的内容复制到保持空间
H(Hold)将模式空间中的内容附加到保持空间
g将保持空间中的内容复制到模式空间
G(Get)将保持空间中的内容附加到模式空间
x(Exchange)交换模式空间和保持空间中的内容

多行操作命令

N

(pattern space : 模式空间)
在这里插入图片描述

通过输入新行,并将其附加到模式空间现有的行之后来创建多行空间,新行和原有的行以\n分隔。sed将其看做一行处理。
实例:

[root@wxy ~]# cat yy.txt
This is the first sentence,
This is the second sentence,
This is the last sentence.

[root@wxy ~]# sed '/first/{N;s/\n/ /}' yy.txt 
This is the first sentence, This is the second sentence,
This is the last sentence.

多行删除命令

D

删除模式空间多行模式的第一个\n之前的内容,之后反复删除模式空间的其余行,并不输入新行。D 命令将缓冲区中第一个换行符(包括换行符)之前的内容删除掉。如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环。

实例:

[root@wxy ~]# cat wxy.txt 

Class again in the afternoon
It's eleven in the morning
I am pretty

thank you
[root@wxy ~]# sed '/^$/{N ; /afternoon/D}' wxy.txt 
Class again in the afternoon
It's eleven in the morning
I am pretty

thank you

d

删除命令(d)删除模式空间的内容并导致读入新的输入行,从而在脚本的顶端

重新使用编辑方法。与删除命令(D)稍微有些不同:它删除模式空间中直到第一个嵌入的换行符的这些内容。下面语句使用了删除命令(d):

/^$/{
 N
 /^\n$/d
 }
[root@wxy ~]# cat test 
This line is followed by 1 blank line.


This line is followed by 2 blank line.



This line is followed by 3 blank line.




This line is followed by 4 blank line.





This is the end.

[root@wxy ~]# sed '
/^$/{
N
/^\n$/d
}' test

sed '/^$/{N;/^\n$/d}' text (横向命令)
This line is followed by 1 blank line.
This line is followed by 2 blank line.

This line is followed by 3 blank line.
This line is followed by 4 blank line.

This is the end.

在这里插入图片描述

多行打印命令

多行打印(Print)命令与小写字母的print命令稍有不同。该命令输出多行模式空间的第一部分,直到第一个嵌入的换行符为止。在执行完脚本的最后一个命令之后,模式空间的内容自动输出(-n 选项或#n 抑制这个默认的动作)。因此当默认的输出被抑制或者脚本中的控制流更改,以至于不能到达脚本的底部时,需要使用打印命令(P或p),Print命令经常出现在Next命令之后和Delete命令之前。这3个命令能建立一个输入/输出循环,用来维护两行的模式空间,但是一次只能输出一行。

Next命令将一个新的输入行追加到模式空间的当前行。在替换命令应用于多行模式空间之后,模式空间的第一部分被Print命令输出,然后被Delete命令删除。这意味着当前被输出并且新的行成为当前行。Delete命令阻止脚本到达底部,这将输出两行并清除模式空间的内容。Delete命令让我们保护了模式空间的第二部分,并将控制转移动脚本的顶端,在顶端所有的编辑命令都可以被应用于一行。这些命令中有一个是Next命令,它将另一个新行读入模式空间。

实例:

[root@wxy ~]# cat text
Here are examples of the LINUX
System. Where LINUX
System appears, it should be the LINUX
Operating System.
[root@wxy ~]# sed '
> /LINUX$/{
> N
> /\nSystem/{
> s// Operating &/
> p
> D
> }}' text
Here are examples of the LINUX Operating 
System. Where LINUX
System. Where LINUX Operating 
System appears, it should be the LINUX
System appears, it should be the LINUX
Operating System.


[root@wxy ~]# cat test 
hello world huquan
yaya, where huquan
yaya, what huquan
it yaya
[root@wxy ~]# sed '                                             
/huquan$/{
N
/\nyaya/{
s// it &/
P
D
}}' test
hello world huquan it 
yaya, where huqu
an it 
yaya, what huquan
it yaya

P&p区别

[root@localhost ~]# cat test.txt
aaa
bbb
ccc
ddd
eee
fff

在这里插入图片描述

保持空间

H/G/h/g命令:

​ 大写的H/G都为追加操作

​ H为模式空间追加到保持空间

​ G为保持空间追加到模式空间

​ 小写的h/g都是覆盖操作

​ h为模式空间覆盖保持空间

​ g为保持空间覆盖模式空间
命令中的每一条都可以利用一个地址来指定一行或行范围.空穴(h,H)命令将数据移至保持空间、而得到(G.G)命令将保持空间的数据移回到模式空间。同一命令的小写字母和大写字母之间的差别是,小字字母命令改写目的缓存区的内容,而大写字母命令追加缓存区的现有内容.

​ Hole命令在保持空间的内容之后放置一个换行符,且后面跟随模式空间的内容(即使保持空间是空的,换行符也被追加到保持空间中)。Get命令模式空间的内容之后放置一个换行符,且后面跟随保持空间的内容

​ Hole命令在保持空间的内容之后放置一个换行符,且后面跟随模式空间的内容(即使保持空间是空的,换行符也被追加到保持空间中)。Get命令模式空间的内容之后放置一个换行符,且后面跟随保持空间的内容。

[root@wxy ~]# cat text
1
2
11
22
111
222

[root@wxy ~]# sed '
> /1/{
> h
> d
> }
> /2/{
> G
> }' text
2
1
22
11
222
111

[root@wxy ~]# sed '
> /1/{
> h
> d
> }
> /2/{
> g
> }' text
1
11
111

匹配“1”的任何行都被复制到保持空间并且从模式空间删除,控制转移到脚本的顶端并且不打印那一行,当读取下一行时,它匹配模式“2”且将已经复制到保持空间的行追加到模式空间之后,然后两行都被打印出来,保存这两行中的第一行并且直到匹配第二行时才输出它。

b 分支命令

通常,sed 程序的执行过程会从第一个脚本命令开始,一直执行到最后一个脚本命令(D 命令是个例外,它会强制 sed 返回到脚本的顶部,而不读取新的行)。sed 提供了 b 分支命令来改变命令脚本的执行流程,其结果与结构化编程类似。

b 分支命令基本格式为:
[address]b [label]
其中,address 参数决定了哪些行的数据会触发分支命令,label 参数定义了要跳转到的位置。

需要注意的是,如果没有加 label 参数,跳转命令会跳转到脚本的结尾,比如:

[root@wxy ~]# cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
[root@wxy ~]# sed '{2,3b ; s/This is/Is this/ ; s/line./test?/}' data2.txt
Is this the header test?
This is the first data line.
This is the second data line.
Is this the last test?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值