2010-01-21 133 views

回答

249

如果你想通過10和12,刪除線5:

sed -e '5,10d;12d' file 

這將結果打印到屏幕上。如果您想將結果保存到同一個文件:

sed -i.bak -e '5,10d;12d' file 

這將備份文件多達file.bak,並刪除指定的線路。

+23

並非所有的unix都有「-i」的gnu sed。不要犯回落到「sed cmd file>文件」的錯誤,這會消滅你的文件。 – pra 2010-01-22 06:53:08

+2

如果我想刪除第五行直到最後一行? – Michelle 2013-05-11 03:58:33

+8

@WearetheWorld'sed -e'5,$ d'文件' – 2013-05-11 20:12:30

14
$ cat foo 
1 
2 
3 
4 
5 
$ sed -e '2d;4d' foo 
1 
3 
5 
$ 
25

和awk,以及

awk 'NR!~/^(5|10|25)$/' file 
+0

注意:這個awk行對於我來說比sed變種更加可靠(在OS-X和Ubuntu Linux之間) – 2012-02-23 19:13:30

+1

請注意,這不會刪除文件中的任何內容。它只是將沒有這些行的文件打印到標準輸出。因此,您還需要將輸出重定向到臨時文件,然後移動臨時文件以替換原始文件。 – mivk 2015-06-05 09:00:35

1

我想提出使用awk的推廣。

當文件由固定大小 的塊和刪除重複每個塊的線製成, AWK可以以這樣的方式

awk '{nl=((NR-1)%2000)+1; if ((nl<714) || ((nl>1025)&&(nl<1029))) print $0}' 
OriginFile.dat > MyOutputCuttedFile.dat 

很好地工作。在這個例子中,尺寸爲塊是2000年,我想打印行[1..713]和[1026..1029]。

  • NR是awk用來存儲當前行號的變量。
  • %給出了兩個整數除法的餘數(或模數)
  • nl=((NR-1)%BLOCKSIZE)+1這裏我們寫入變量nl當前塊內的行號。 (見下文)
  • ||&&是邏輯運算ORAND
  • print $0寫全線

Why ((NR-1)%BLOCKSIZE)+1: 
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0. 
    +1 We add again 1 because we want to restore the desired order. 

+-----+------+----------+------------+ 
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 | 
+-----+------+----------+------------+ 
| 1 | 1 | 0  |  1  | 
| 2 | 2 | 1  |  2  | 
| 3 | 0 | 2  |  3  | 
| 4 | 1 | 0  |  1  | 
+-----+------+----------+------------+ 

+2

我很佩服你實現你瘋狂的名字的方式。 – 2015-04-23 08:09:54

13

您可以通過 sed的-i '33D' 文件

這與刪除其行號特定一行將刪除33行號碼上的行並保存更新的文件。

3

這通常是反模式的症狀。生成行號的工具可能會被替換爲立即刪除行的行。例如;

grep -nh error logfile | cut -d: -f1 | deletelines logfile 

(其中deletelines是您想象你需要的實用工具)是一樣的

grep -v error logfile 

話雖如此,如果你是在一個情況下,你真的需要執行此任務,可以從行號文件生成一個簡單的sed腳本。幽默(但也許稍微混淆),你可以用sed來做到這一點。

sed 's%$%d%' linenumbers 

此接受的行號,每行一個的一個文件,併產生,在標準輸出,與d相同行號的每個後追加。這是一個有效sed腳本,我們可以保存到一個文件,或者(在某些平臺上)管到另一個sed例如:

sed 's%$%d%' linenumbers | sed -f - logfile 

在某些平臺上,sed -f不理解選項參數-意味着標準輸入,因此必須將腳本重定向到臨時文件,並在完成後將其清理乾淨,或者如果您的操作系統(或外殼)具有該文件,則可以用/dev/stdin/proc/$pid/fd/1替換單獨的短劃線。

與往常一樣,您可以在-f選項之前添加-i,以便sed編輯目標文件,而不是在標準輸出上生成結果。在* BSDish平臺(包括OSX)上,您還需要提供一個明確的參數給-i;一個常見的習慣用法是提供一個空洞的論據; -i ''

+0

我不太同意「反模式的症狀」。基於標記的文件類型(例如XML或JSON)在最後需要特定的行才能成爲有效的文件。在這種情況下,通常是最合理的方法來刪除這些行,將想要添加的內容放入文件中,然後重新添加這些行,因爲將這些行直接放在一起可能會更加努力並且不利儘可能避免像sed這樣的額外工具。 – 2017-11-12 12:02:12

相關問題