'N'和'D'不像sed预期的那样工作

sed 'N; D' testfile 

testfile包含:

 this is the first line this is the second line this is the third line this is the fourth line 

我正在使用RHEL 6,输出结果如下:

 this is the fourth line 

根据我的理解, N只是将下一行拉入模式空间, D只删除模式空间的第一行。 所以输出应该是:

 this is the second line this is the fourth line 

有人能解释为什么输出如上所述吗?

根据文件 :

d

如果模式空间不包含换行符,就像d命令发出一样,开始一个正常的新周期。 否则,删除模式空间中的文本直到第一个换行符,然后重新启动循环,结果为模式空间 ,而不读取新的输入行。

(强调我的)

这听起来像这样会从头开始重新启动你的sed程序,读取和删除行,直到输入完成,此时只有最后一行留在缓冲区中。

如已经示出的那样,使用D将移动到程序的开始。 但是,您可以使用以下内容来打印偶数行:

 sed -n 'n;p' 

并打印赔率:

 sed 'n;d' 

在GNU sed中,你也可以使用:

 sed '0~2!d' # Odd sed '1~2!d' # Even 

另一种可以是这样的:

 N;s/^[^\n]*\n// 

这将读取模式空间的下一行,然后替换第一个。

有人可能会问为什么这是行为。 其中一个原因就是使这样的事情成为可能,使用模式空间中的多行:

 $!N;/\npattern$/d;P;D 

以上将删除与之前的行匹配的行。