2015-03-24 81 views
2

當用sed指定行號時,它會在指定範圍內執行指定的操作。所以,指定了「反轉」範圍的sed行號範圍

sed -n '5,10 p' < file 

將從文件打印5到10行。所以我的理解是,它掃描文件以找到匹配第一個指定參數(5)的行號,並執行指定的操作,直到達到與第二個參數(10)匹配的行號。但是,當我倒轉範圍時,例如:

sed -n '10,5 p' < file 

它僅在文件中打印第10行。那麼,我關於sed運行方式的假設是否正確?什麼導致第10行甚至是打印的,因爲指定的「範圍」甚至不是實際的有效範圍?

謝謝!

回答

5

the man page

的一個地址範圍可以通過指定由逗號分隔的兩個地址來指定(,)。地址範圍匹配從第一個地址匹配的地方開始的行,並且一直延續到第二個地址匹配(包含地)。

如果第二個地址是一個正則表達式,那麼檢查結束匹配將從匹配第一個地址的行後面的行開始:範圍總是跨越至少兩行(當然,如果輸入流結束)。

如果第二個地址是一個小於(或等於)與第一個地址匹配的行的數字,那麼只匹配一行。

請注意第一段中的「包含性」一詞,然後在第三段中註明較長的解釋。

爲什麼?不要在這裏讓我們形而上...... :-)

+0

是啊,手冊頁說全是 – hek2mgl 2015-03-24 21:59:52

+0

我想,這就是我應該開始的地方,而不是跳入教程...聽到特別是關於sed的man page的不太好的東西,所以我跳過了它。我的錯! – 2015-03-24 22:17:52

+1

如果這回答您的問題,請將其標記爲接受的答案。 – 2015-03-24 22:23:59

1

如果您指定的起始和結束是行號的範圍,結束行號必須大於起始行號。如果結束行號小於或等於起始行號,則範圍僅適用於起始行號。手冊頁說明了這一點,Peter Bowers想通了!


我首先想到的是要打印範圍內的行以相反的順序,你可以管tac在這種情況下:

sed -n '5,10p' file | tac 

如果你想使用(GNU )sed只,您可以使用以下腳本:

sed -n '5,10{x;H};${x;s/\n$//p}' 

如果當前行在ra在510之間的nge將使用x交換模式緩衝區和保持緩衝區。現在當前行位於保持緩衝區之上。之後,使用H將模式緩衝區(前一個保持緩衝區)附加到保持緩衝區。在保持緩衝區中以相反順序存儲感興趣的行。在輸入$結束時,我們交換保持緩衝區和模式緩衝區,在最後替換換行符,最後使用p打印它。使用-n命令行選項禁用正常輸出。

+0

因此需要一個像按鈕... :-) – 2015-03-24 21:51:25

+0

OP不要求用''10',5''的反轉線 - 他是隻是想知道爲什麼會打印任何一行......但任何引用tac的人都會在我的書中得到分數。 – 2015-03-24 21:56:34

+0

@PeterBowers謝謝!是的,「tac」命令的名字確實很有趣!而命令本身是非常有用的..(但它可以用'sed'模擬;) – hek2mgl 2015-03-24 21:58:12