[译]Unix sed实用教程第四篇–选择性打印

本文,我们将会学习如何选择性的打印(其实,这里的打印是print,也就是输出到标准输出的意思),用到的示例文件是:

$ cat file
Gmail 10
Yahoo 20
Redif 18
1.打印所有内容
$ sed “ file
Gmail 10
Yahoo 20
Redif 18
一对单引号,没有任何参数即可

2.如何打印包含Gmail的那一行.(grep也可以实现这个功能)

$ sed ‘/Gmail/p’ file
Gmail 10
Gmail 10
Yahoo 20
Redif 18
在斜线里面,我们指定正则匹配模式,p的意思呢,就是print,打印的意思,也就是打印包含Gmail这一行,但是我们看到Gmail打印了两次,为什么,因为sed的默认行为是在解析完一行之后就把他输出出来,也就是对于Gmail这一行,先执行p解析,解析完成后再默认打印一次,就打印了两次,而其他的,没有命令解析,直接读入完成后输出即可。

如果得到期望的结果呢?

$ sed -n ‘/Gmail/p’ file
Gmail 10
-n参数会取消sed的默认打印行为,所以就ok了

3.删除包含Gmail的那一行。(grep -v也有同样的效果)

$ sed  ’/Gmail/d’ file
Yahoo 20
Redif 18
d就是delete的意思,不多解释,

同样,要想删除某一指定的行

$ sed ‘1d’ file
Yahoo 20
Redif 18
4.打印直到模式匹配,这里我们从头一直打印到Yahoo
$ sed  ’/Yahoo/q’ file
Gmail 10
Yahoo 20
q就是quit的意思,这条命令就是对于前面的行都没啥可解析的,执行默认的打印即可,一到碰到Yahoo这一行,打印完成,就停止,退出,因此,就是上面的了

打印某一指定范围行

到此,我们一直在学习基于一个条件取一行或多行,现在,我们来学习打印指定范围行

使用的示例文件如下:

$ cat file
Gmail 10
Yahoo 20
Redif 18
Inbox 15
Live  23
Hotml 09
5.打印前三行
$ sed -n ‘1,3p’ file
Gmail 10
Yahoo 20
Redif 18
-n先取消默认打印,然后1,3指定行范围,p表示打印,你想一下我们前面的q命令,就知道下面这个命令效果是一样的
$ sed ‘3q’ file
Gmail 10
Yahoo 20
Redif 18
执行默认打印,到第三行的时候退出

6.通过模式指定范围,这里我打印从Yahoo到Live之间的行,包括本身

$ sed -n ‘/Yahoo/,/Live/p’ file
Yahoo 20
Redif 18
Inbox 15
Live  23
不用多解释了

7.从指定模式到文件尾部,这里是从Redif到文件尾

$ sed -n ‘/Redif/,$p’ file
Redif 18
Inbox 15
Live  23
Hotml 09
回忆一下$符号吧.少年

8.从开头到匹配模式

$ sed -n ‘1,/Inbox/p’ file
Gmail 10
Yahoo 20
Redif 18
Inbox 15
相信你懂的…

对于数字不需要斜线包围,对于匹配需要斜线.就这样..

 

 

linux  shell 
comments powered by Disqus