2017-07-24 83 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 
相關問題