2010-04-01 77 views
29

如何使用sed刪除每條奇數行?如何使用sed刪除其他所有行?

remove 
keep 
remove 
keep 
remove 
... 
+0

半今天早上似乎是愚人節的笑話,以及... – Will 2010-04-01 12:55:04

+0

如果是愚人節的話,那麼答案必須是:grep不是input.txt – paxdiablo 2010-04-01 13:12:32

+0

@paxdiablo:那麼'grep -v Remove'呢? – Cascabel 2010-04-01 14:06:52

回答

51

GNU SED具有合適的尋址模式:

sed -n '1~2!p' file 

這意味着,從第1行開始,並用步驟2中,打印所有其它線路。

同樣地,你可以刪除-n和刪除匹配的行:

sed '1~2d' 

它也可以用awk完成:

awk 'NR%2==0' file 

(當行數是2的倍數,打印線)

+0

謝謝!很有幫助。 – 2016-12-11 15:28:32

+1

當我在macos上用sed試試這個時,我得到錯誤「invalid command code〜」。 – 2017-12-13 12:54:37

31

這裏是我能想到的最短的:

sed -n 'g;n;p' file 

它應該與非GNU版本sed(以及GNU sed)一起使用。

+4

+1便攜式 – 2012-10-02 15:40:02

+3

這也適用於OS X! (不像'sed -n'1〜2!p''。)它需要2,4,6行......我無法從man page中弄清楚如何採用1,3,5行。不過,添加第一行很簡單。 – Nagel 2013-08-02 12:47:32

+7

@Nagel:嘗試:'sed -n'p; n'file'或'sed'n; d'file'用於輸出奇數行。順便說一句,我不認爲'g'是輸出偶數行所必需的:'sed -n'n; p'file'似乎可行。 – 2013-08-02 14:03:25

3

Perl的解決方案:

perl -ne 'print if $. % 2 == 0' file 

$.是行號的問題

+0

這個人問'sed',你的閱讀能力很差,但是有人會覺得這很有用,所以+1。 – 2015-09-16 01:59:02

+1

我回答自sed,awk和perl經常可以互換使用。 儘管速度和簡單性有所不同,但它們全部用於命令行或shell腳本中。 – 2015-09-16 14:31:14