sed高级用法

2 篇文章 0 订阅

sed高级用法

###可以把 sed高级命令分成3个组:
1.处理了多行模式空间(N、D、P)。
2.采用保持空间来保存模式空间的内容并使它可用于后续的命令(H、h、G、g、x) 。
3.编写使用分支和条件指令的脚本来更改控制流(:、b、t) 。

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

1、多行模式空间

模式匹配是面向行的,像grep这样的程序尝试在单个输入行上匹配一个模式。这就使它很难匹配一个在一行的结尾处开始。并在下一行的开始处结束的短语。其他一些模式只有当在多行上重复时才有意义。

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

  • Next 命令(N):将数据流中的下一行追加到模式空间,形成多行模式空间
  • Delete(D):删除多行组中的一行。
  • Print(P):打印多行组中的一行。

2、 追加下一行

多行Next (N)命令通过读取新的输入行,并将它添加到模式空间的现有内容之后来创建多行模式空间。模式空间最初的内容和新的输入行之间用换行符分隔。在模式空间中嵌入的换行符可以利用转义序列“\n”来匹配。在多行模式空间中,元字符“^”匹配空间中的第一个字条,而不匹配换行符后面的字符。同样,“$”只匹配模式空间中最后的换行符,而不匹配任何嵌入的换行符。在执行next命令之后,控制将被传递给脚本中的后续命令。

Next命令与next命令不同,next输出模式空间的内容,然后读取新的输入行。next命令不创建多行模式空间。

下面这个例子演示N命令的功能

#匹配到此行,把换行替换成空行
[root@localhost opt]# cat test 
xion        
gke shi wo  er zi zu
 i xi huan fang pi
[root@localhost opt]# sed '/xion/N;s/\n//;' test 
xiongke shi wo sha er zi zu
 i xi huan fang pi
[root@localhost opt]# 

#多行匹配,换成空行

[root@localhost opt]#  sed  '/xion/{N;s/\n//;N;s/\n //};' test 
xiongke shi wo sha er zi zui xi huan fang pi
[root@localhost opt]# 

##也可以把执行命令放入一个文件
[root@localhost opt]# cat sedexport 
/xion/{
N;s/\n//
N;s/\n //
}
[root@localhost opt]# 

[root@localhost opt]# sed -f sedexport test 
xiongke shi wo sha er zi zui xi huan fang pi

3、D 多行删除命令

删除命令(d)删除模式空间的内容并导致读入新的输入行,从而在脚本的顶端重新使用编辑方法。删除命令(D)稍微有些不同:它删除模式空间中直到第一个嵌入的换行符的这部分内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用于模式空间剩余的内容,我们可以编写一个实现查找一系列空行并输出单个空行的脚本,以看看它们之间的区别。

当遇到一个空行时,下一行就追加到模式空间中。然后试着匹配嵌入的换行符。注意定位元字符^和$分别匹配模式空间的开始处和结束处。下面是测式文件:

##编写一个txt文件,删除掉里面的空行
[root@localhost opt]# cat test 
xiong da jiao xioym .

xiong er jiao xiongke .


guang tou qiang jiao ff .




ji ji jiao shunzi .
[root@localhost opt]# 

#删除掉文件里面的空行
[root@localhost opt]# sed '/^$/{N;/^\n$/d}' test
xiong da jiao xioym .

xiong er jiao xiongke .
guang tou qiang jiao ff .
ji ji jiao shunzi .

上面这个例子中,用sed匹配到文本在使用N将匹配到文本和下一行加入到模式空间,然后删除替换符,结果就是在文件中的两行合并成了一行

但是当有偶数个空行时,所有的空行都会被删除。仅当有奇数个空行时,有一行被保留下来。这是因为删除命令清除的是整个模式空间。一旦遇到第一个空行,就读入下一行,并且两行都被删除。如果遇到第三个空行,并且下一行不为空,那么删除命令就不会被执行,因此空行被输出。如果使用多行Delete命令(是D不是d),就能得到我们想要的结果:

#使用大D(Delete)则命令
[root@localhost opt]# sed '/^$/{N;/^\n$/D}' test 
xiong da jiao xioym .

xiong er jiao xiongke .

guang tou qiang jiao ff .

ji ji jiao shunzi .
[root@localhost opt]# 

多行Delete命令完成工作的原因是,当遇到两个空行时,Delete命令只删除两个空行中的第一个。下一次遍历该脚本时,这个空行将导致另一行被读入模式空间。如果那行不为空,那么两行都输出,因此确保了输出一个空行。换句话说,当模式空间中有两个空行时、只有第一个空行被删除。当一个空行后面跟有文本时,模式空间可以正常输出。
这个空行将导致另一行被读入模式空间。如果那行不为空,那么两行都输出,因此确保了输出一个空行。换句话说,当模式空间中有两个空行时、只有第一个空行被删除。当一个空行后面跟有文本时,模式空间可以正常输出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值