sed学习03

1.三个可用于处理多行文本的命令

·N:加入数据流中的下一行,创建一个多行组进行处理。
·D:删除多行组中的一行。
·P:打印多行组中的一行。

2.例子

2.1 例子1

$ cat -n data1.txt 
     1	Header Line
     2	
     3	Data Line #1
     4	
     5	End of Data Lines

2.11 如何删除空行2和3

$ sed '/^$/d' data1.txt

2.12 如何只删除空行2

$ sed '/Header/{n ; d}' data1.txt

2.2 例子2 合并文本行

$ cat -n data2.txt 
     1	Header Line
     2	First Data Line
     3	Second Data Line
     4	End of Data Lines
$ sed '/First/{ N ; s/\n/ / }' data2.txt 
Header Line 
First Data Line Second Data Line 
End of Data Lines 

如果要在数据文件中查找一个可能会分散在两行中的文本短语,那么这是一个很管用的方法。这里有个例子:

$ cat -n data3.txt 
     1	On Tuesday, the Linux System
     2	Admin group meeting will be held.
     3	All System Admins should attend.
     4	Thank you for your cooperation.
$ sed 'N ; s/System.Admin/DevOps Engineer/' data3.txt
On Tuesday, the Linux DevOps Engineer group meeting will be held.
All DevOps Engineers should attend.
Thank you for your cooperation.
$

用N命令将第一个单词所在行与下一行合并,即使短语内出现了换行,仍然可以查找到该短语。注意,替换命令在System和Admin之间用了点号模式(.)来匹配空格和换行符这两种情况。
但如果点号匹配的是换行符,则删掉换行符会导致两行被合并成一行。这可能不是你想要的结果。
要解决这个问题,可以在sed编辑器脚本中用两个替换命令,一个用来处理短语出现在多行中的情况,另一个用来处理短语出现在单行中的情况:

$ sed 'N
> s/System\nAdmin/DevOps\nEngineer/
> s/System Admin/DevOps Engineer/
> ' data3.txt
On Tuesday, the Linux DevOps
Engineer group meeting will be held.
All DevOps Engineers should attend.
Thank you for your cooperation.
$

第一个替换命令专门查找两个单词间的换行符,并将其放在了替换字符串中。这样就能在新文本的相同位置添加换行符了。但还有个不易察觉的问题。该脚本总是在执行sed编辑器命令前将下一行文本读入模式空间,当抵达最后一行文本时,就没有下一行可读了,这时N命令会叫停sed编辑器。如果要匹配的文本正好在最后一行,那么命令就无法找到要匹配的数据:

$ cat data4.txt
On Tuesday, the Linux System
Admin group meeting will be held.
All System Admins should attend.
$
$ sed 'N
> s/System\nAdmin/DevOps\nEngineer/
> s/System Admin/DevOps Engineer/
> ' data4.txt
On Tuesday, the Linux DevOps
Engineer group meeting will be held.
All System Admins should attend.
$

System Admin文本出现在了数据流中的最后一行,但N命令会错过它,因为没有其他行可以读入模式空间跟这行合并。这个问题不难解决——将单行编辑命令放到N命令前面,将多行编辑命令放到N命令后面,就像下面这样:

$ sed '
> s/System Admin/DevOps Engineer/
> N
> s/System\nAdmin/DevOps\nEngineer/
> ' data4.txt
On Tuesday, the Linux DevOps
Engineer group meeting will be held.
All DevOps Engineers should attend.
$

三级标题

四级标题
五级标题
六级标题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值