sed高级命令

sed语法

sed的语法格式:

	sed [option] {sed-command} {input-file}

高级脚本

它们改变了执行或控制的流程顺序。通常,一行被读入模式空间并且用脚本中的每个命令(-一个接一个地)应用于那一行。当达到脚本的底部时,输出这一行并且清空模式空间。然后新行被读入模式空间,并且控制被转移回脚本的顶端。这是sed脚本中正常的控制流。

sed在正常情况下,将处理的行读入模式空间(pattern space)脚本中的“sed-command(sed命令)”就一条接着一条进行处理,知道脚本执行完毕。然后该行被输出,模式(pattern space)被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。(就是追加下一行)

如果不懂意思可以看下以下的图进行理解:

sed

有些用户希望在某个条件下,脚本中的某个命令被执行或希望模式空间(pattern space)保留,以便下一次使用,这都有可能使sed在处理文件的时候,不按照正常的流程来进行处理,这时候就需要用sed高级命令来满足需求。

sed图像化了解:

示例:用sed模拟出tac的功能(倒序输出)。

文件内容

[root@apache ~]# cat test
1
2
3

图解分析:

P:Pattern Space

H:Hold Space

蓝色:Hold Space中的数据

绿色:Pattern Space中的数据
在这里插入图片描述

sed命令之N命令:

将下一行添加到pattern space中。将当前读入行和用N命令添加的下一行看成“一行”。

使用N之后的流程:
在这里插入图片描述
实例:

[root@apache ~]# cat test 
hall
o baby
[root@apache ~]# sed -n '/hall/p' test 
hall
[root@apache ~]# sed -n '/hall/N;p' test 
hall
o baby
#如果想把两行合为一行就把换行中间的空去掉
[root@apache ~]# sed '/hall/N;s/\n//' test 
hallo baby

注意:使用N的时候,也是把下一行读到pattern space,但是在这里已经只对第一行进行处理,而不理会第二行。

sed命令之n命令:

pattern space中有2行内容,但是先读取的那一行不会被取代、覆盖或删除;当n命令后,还有其他命令p的时候,此时打印出的结果是n命令读取的那一行的内容
在这里插入图片描述

实例:

[root@apache ~]# cat test
1
2
11
22
111
222
[root@apache ~]# sed -n '/1/{n;p}' test 
2
22
222

sed命令之D命令:

如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间 不包含换行符,则会像发出d命令那样启动正常的新循环。(删除第一行,但第二行保留)
sed

[root@apache ~]# cat test 
hall
o baby
[root@apache ~]# sed '/hall/D' test 
o baby
[root@apache ~]# sed '/hall/{N;D}' test 
o baby

sed命令之d命令:

删除pattern中的所有行,并读入下一新行到pattern中

[root@apache ~]# cat test
1
2
11
22
111
222
[root@apache ~]# sed '/1/{d;p}' test 
2
22
222

sed命令之p命令:

p打印当前模式空间内容,追加到默认输出之后

实例

[root@apache ~]# cat test
1
2
11
22
111
222
[root@apache ~]# sed '/2/{d;p}' test
1
11
111

sed命令之P命令:

打印从开始到第一个\n的内容,sed并不对每行末尾\n进行处理,但是对N命令追加的行间\n进行处理,因为此时sed将两行看做一行

[root@apache ~]# cat test1
Here are example of the UNIX
System. Where UNIX
System appears, it should be the UNIX
Operating System
[root@apache ~]# cat sedscr 
/UNIX$/{
N
/\nSystem/{
s// Operating &/
P
D
}
}
[root@apache ~]# sed -f sedscr test1
Here are example of the UNIX Operating 
System. Where UNIX Operating 
System appears, it should be the UNIX
Operating System

sed命令之H命令:

将pattern space中的内容append到hold space\n后(将当前模式空间中的内容追加至保持空间)


sed命令之h命令:

将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除(将当前模式空间中内容覆盖至保持空间)

[root@apache ~]# cat list         #文本内容
find the match statement  uagidvbiyhavwi
abcde the tom statement  uagidvbiyhavwi
abcde the jerry statement  uagidvbiyhavwi
[root@apache ~]# cat sedscript                       #脚本进行相应的操作                      
/the .* statement/{		         #依次匹配到3行的全部内容
h                                #依次复制或追加到保持空间
s/.*the (.*) statement.*/\1/ }     #匹配到(.*)的内容,(.*)就是Match tom jerry,替换成\1
[root@apache ~]# sed -rf sedscript list        #带上-r扩展正则表达式的参数查看
Match
tom
jerry

sed命令之G命令:

将hold space中的内容append到pattern space\n后(将当前保持空间中的内容追加至模式空间)

root@apache ~]# cat sedscript 
/the .* statement/{
h
s/.*the (.*) statement.*/\1/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/(.*)\n(.*the) .*(statement)/\2 \1 \3/                                       
}
[root@apache ~]# sed -rf sedscript list
find the MATCH statement  uagidvbiyhavwi
abcde the TOM statement  uagidvbiyhavwi
abcde the JERRY statement  uagidvbiyhavwi

sed命令之g命令:

将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除(将当前保持空间中内容覆盖至模式空间)

sed命令之x命令:

交换保持空间和模式空间的内容

sed命令之b命令:

改变命令脚本的执行流程,其结果与结构化编程类似

[root@apache ~]# cat test
ll
zhangsan
lisi
[root@apache ~]# sed '{1,2b ; s/zhangsan/ym/ ; s/lisi/my/}' test
ll
zhangsan
my

sed命令之s替换命令
要求:第五行的root内容替换成roots
[root@apache ~]# cat list
root
tom
lisi
redhat
root
[root@apache ~]# sed '5 s/root/roots/' list
root
tom
lisi
redhat
roots

要求:忽略大小写的替换
[root@apache ~]# cat -n list
     1  root
     2  tom
     3  lisi
     4  redhat
     5  Root
[root@apache ~]# sed '5 s/root/roots/i' list
root
tom
lisi
redhat
roots

#将所有root替换成roots,不能成为rootss是错误的
[root@apache ~]# cat list
root
tom
lisi
redhat
Root
roots
[root@apache ~]# cat list
root
tom
lisi
redhat
Root
roots
[root@apache ~]# sed  -r 's/\<root\>/roots/i' list
roots                    #使用正则表达式
tom
lisi
redhat
roots
roots
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值