2017-03-07 68 views
2

運行Fedora 25服務器版。 sed --version給我sed (GNU sed) 4.2.2以及通常的版權和聯繫信息。我已經創建了一個文本文件sudo vi ./potential_sed_bug。 VI顯示該文件的內容(與:set list啓用)爲:爲什麼「sed -n -i」刪除現有的文件內容?

don't$ 
delete$ 
me$ 
please$ 

我然後運行以下命令:

sudo sed -n -i.bak /please/a\testing ./potential_sed_bug

在我們討論的結果;這裏是什麼sed man page說:

-n,--quiet,--silent 抑制模式空間的自動打印

-i [後綴] - 就地編輯[=後綴] 編輯文件(如果提供了擴展名,則進行備份)。默認操作模式是中斷符號鏈接和硬鏈接。這可以通過--follow-symlinks和--copy來改變。

我也看了other sed command references瞭解如何追加sed。根據我對我所做的研究的理解;生成的文件內容應該是:

don't 
delete 
me 
please 
testing 

但是,運行sudo cat ./potential_sed_bug給我下面的輸出:

testing 

在這種差異的光,是我,我跑不正確或命令的理解是有sed /環境有問題嗎?

回答

3

TL;博士

  • 不要使用-n-i:除非你在sed腳本中使用明確的輸出命令,什麼都不會被寫入文件。

  • 使用-i產生沒有標準輸出(終端)的輸出,所以沒有什麼多餘的,你需要做的,使你的命令安靜。


默認情況下,sed自動打印(可能被修改)輸入線到任何其輸出目標是,不論是隱含的或顯式指定:通過默認,向標準輸出(終端,除非重定向) ;與-i,到最終替換輸入文件的臨時文件

兩種案件,-n抑制這個自動打印,這樣 - 除非你使用顯式輸出功能,如p或者,你的情況,a - 什麼被打印到stdout /寫入臨時文件。

  • 注意,自動打印適用於所謂的圖案空間,這是其中(可能被修改)輸入被保持;明確的輸出功能,例如paic打印到圖案空間(潛在的後續修改),它們打印直接向目標流/文件,這就是爲什麼a\testing能夠產生輸出,儘管使用-n

注意,與-ised的隱式印刷/顯式輸出指令打印到臨時文件,而不是也到stdout,因此使用-i一個命令是總是安靜相對於標準輸出(端子)輸出 - 沒有什麼額外的你需要做的。


爲了給出一個具體的例子(GNUsed語法)。

由於使用-i是偶然的問題,爲簡單起見,我省略了它。請注意,-i首先打印到臨時文件,其中,完成後,替換原來的。這與陷阱,尤其是符號鏈接的潛在破壞;看到我的this answer的下半部分。

# Print input (by default), and append literal 'testing' after 
# lines that contain 'please'. 
$ sed '/please/ a testing' <<<$'yes\nplease\nmore' 
yes 
please 
testing 
more 

# Adding `-n` suppresses the default printing, so only `testing` is printed. 
# Note that the sequence of processing is exactly the same as without `-n`: 
# If and when a line with 'please' is found, 'testing' is appended *at that time*. 
$ sed -n '/please/ a testing' <<<$'yes\nplease\nmore' 
testing 

# Adding an unconditional `p` (print) call undoes the effect of `-n`. 
$ sed -n 'p; /please/ a testing' <<<$'yes\nplease\nmore' 
yes 
please 
testing 
more 
+0

@AMemberofDollars:這樣做的缺點:處理的順序沒有改變,是的,臨時文件首先被寫入,只有在完成它取代原來的 - 請我的更新。 – mklement0

+1

@stevesliva:我明白了,謝謝。我已經相應地更新了答案。 – mklement0

+1

有趣的是,我一直認爲'sed -e cmd1 | sed -e cmd2'相當於'sed -e cmd1 -e cmd2',但是如果由於某種原因你想要修改的內容是你正在追加的內容,那麼這個區域實際上就是想要sed到sed的。我想'n'和'q'其他命令也會打破這種等價性。 – stevesliva

相關問題