曲径通幽论坛

标题: P 和 D 命令 [打印本页]

作者: beyes    时间: 2012-2-1 00:43
标题: P 和 D 命令
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 中的内容删除。所以上面命令执行的结果是“删除掉某文件中的最后两行”。
作者: beyes    时间: 2012-2-1 01:30
标题: 打印最后两行,删除掉重复、连续的行
下面是两个例子

例一:打印最后两行
[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 命令将删除第一条,然后重新一轮命令循环。这样做的结果是,重复的或者是连续的行都将被合并成一行。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2