2017-07-24 85 views
3

我的sed脚本是这样的:sed的:H和d行为

# script.sed 
1,3H 
1,3g 
3D 

当我运行它,我得到如下:

$ seq 5 | sed -f script.sed 

1 

1 
2 
4 
5 

然而,这似乎是我错了。在第3行中,一旦执行了d命令,图案空间具有

1 
2 
3 

当重新启动周期,H应该设置在保持空间:

<empty_line> 
1 
2 
3 
1 
2 
3 

然后,克应设置图案空间到相同的内容。 D将删除第一条(空的)行。每次循环重新启动时,保持空间将有效地增加一倍。因此,这应该导致无限循环。

我错过了什么?

+0

在第3行中的'D'命令的重复删除高达并且包括在模式空间的每一行,直到没有行被保留。该命令基本上停留在第3行,直到所有内容都被删除。 – potong

+0

@potong不正确。如果我在它之前包含'=',我可以看到多行打印行号(3)。所以,它从顶部开始。 – euphoria83

+0

但是第3行永远不会被打印,因为当执行'D'命令时,sed循环的正常打印部分永远不会到达。尝试插入'3p'命令或'3P'。 – potong

回答

1

下面,我展示如何解释该预期执行,示出了命令的结果作为一个有序对,与图案空间的第一和保持空间以下:

1: H(1,\n1) g(\n1,\n1)        > \n1\n 
2: H(2,\n1\n2) g(\n1\n2,\n1\n2)      > \n1\n2\n 
3: H(3,\n1\n2\n3) g(\n1\n2\n3,\n1\n2\n3) D(,\n1\n2\n3) > 
4:              > 4\n 
5:              > 5\n 

如果我采取的输出这种解释并与-e选项串连成一个echo命令,我得到:

$ echo -e '\n1\n\n1\n2\n4\n5\n' 

1 

1 
2 
4 
5 
相关问题