曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3325|回复: 1
打印 上一主题 下一主题

P 和 D 命令

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-2-1 00:43:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
P  命令用来打印 pattern space 里的第一行(直到换行符 \n)
D 命令删除掉 pattern space 里的第一行,然后重新下一个处理循环,如果此时 pattern space 里仍有数据,那么 sed 不会从输入中读入数据。


测试文本内容如下:
[root@qunet sed]# cat temp.txt
hello world
hello linux


hello shell
hello groad
hello google

上面文本内容中包含了 2 个空白行。

下面将用 N ,P,D 这 3 个命令的组合删除掉最后 2 行内容:
[root@qunet sed]# sed 'N;$!P;$!D;$d' temp.txt
hello world
hello linux


hello shell




当 sed 命令开始执行时,sed 首先会读入第 1 行(hello world)到 pattern space ,接着执行 'N' 命令,该命令读入第 2 行到 pattern space ,这时候 pattern space 中的内容为:
hello world\nhello linux



接着 $!P 会先判断是否到达文件末尾,如果不是,那么打印出 pattern space 中的第一行内容,即 hello world 。


接着 $!D 命令就会删除 pattern space 中的第一行,并重新启动处理循环,而不会接着执行 $d 命令。


接下来的处理中,pattern space 中的内容依次是 "第2行\n第3行” ---> “第3行\n第4行" ---> "第4行\n第5行"  --> ”第5行\n第6行" --> "第6行\n第7行" 。到最后一步时,检查到已经到达文件末尾,于是 $d 命令将 pattern space 中的内容删除。所以上面命令执行的结果是“删除掉某文件中的最后两行”。

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
沙发
 楼主| 发表于 2012-2-1 01:30:11 | 只看该作者

打印最后两行,删除掉重复、连续的行

下面是两个例子

例一:打印最后两行
[beyes@beyes   sed]$ sed '$!N;$!D' temp.txt
hello groad
hello google

例二:删除掉重复、连续的行

测试文本内容如下:
[beyes@beyes   sed]$ cat temp.txt
hello world
hello linux


hello shell
hello shell
hello groad
hello google
hello google
hello google

运行输出:
[beyes@beyes   sed]$ sed '$!N; /^\\(.*\\)\\n\\1$/!P; D' temp.txt
hello world
hello linux

hello shell
hello groad
hello google
上面命令中,先读入第一行,然后判断是否已经在文件末尾,如果不是,那么再读入一行到 pattern space,然后“ /^\\(.*\\)\\n\\1$/!P” 这条命令先判断 pattern space 里的两行是否是相同内容的行,如果不是那么就打印第一条,若是,那么 D 命令将删除第一条,然后重新一轮命令循环。这样做的结果是,重复的或者是连续的行都将被合并成一行。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-15 21:01 , Processed in 0.059510 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表