2014-02-28 42 views
1

我有一个问题有关的sed:
在file.txt的假设的东西是这样的:

one 


two 
three 

然后我运行:

sed '/^$/d;G' file.txt 

我认为这个过程应该是这样的:

for line in file { 
    pattern_space = line 
    if (pattern_space == "\n") then pattern_space = "" 
    pattern_space = pattern_space + "\n" + hold_space 
    print pattern_space 
} 

话,我想结果应该是这样的:(空白行不动,非空白线后跟行)

one 



two 

three 

但是,现实的情况是:

one 

two 

three 

我仿佛运行的sed '/^$/d' file.txt的| sed G,我对此感到困惑。
你能告诉我什么是正确的过程吗?有什么我误解?
/BR

回答

3

这是因为在d结束的脚本立即结束该行的处理,而不会(默认)打印。如果您想跳过脚本的其余部分,但仍然执行脚本结束操作,请改为使用b。默认b牧场目标是脚本结束。

+0

嗨,@jthill,我想问一点点,请。从手册中说,“n N读/将下一行输入添加到模式空间中”,当我使用** n **时,为什么模式空间中的原始内容被打印出来?例如“sed'n; d'file.txt”,这个命令只是切断了偶数行。我认为应该没有什么输出,因为**阅读下一行到**。 pattern_space中的原始东西应该消失,但它不是 – ruanhao

+0

我不知道你在哪里得到该手册,[真正的](http://www.gnu.org/software/sed/manual/sed。 html)说---'n' 如果自动打印未禁用,则打印模式空间,然后,无论如何,用下一行输入替换模式空间。如果没有更多输入,则sed退出而不处理任何更多的命令 – jthill

+0

谢谢@jthill,你是对的 – ruanhao