bash - sed排除 - sed用法




sed命令查找並替換文件並覆蓋文件不起作用,它清空文件 (9)

使用sed的-i選項,例如

sed -i bak -e s/STRING_TO_REPLACE/REPLACE_WITH/g index.html

我想通過命令行在HTML文件上運行查找和替換。

我的命令看起來像這樣:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html > index.html

當我運行這個,然後看文件時,它是空的。 它刪除了我的文件的內容。

當我在再次恢復文件後運行此操作時:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

stdout是文件的內容,查找和替換已執行。

這是為什麼發生?


另一種有用的模式是:

sed -e 'script script' index.html > index.html.tmp && mv index.html.tmp index.html

這有很多相同的效果,不使用-i選項,另外意味著,如果sed腳本由於某種原因失敗,輸入文件不會被破壞。 此外,如果編輯成功,則不會留下備份文件。 這種成語在Makefiles中很有用。

相當多的seds都有-i選項,但不是全部。 posix sed是沒有的。 因此,如果您的目標是便攜性,最好避免。


您可以在Ex模式下使用Vim:

ex -sc '%s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g|x' index.html
  1. %選擇所有行

  2. 保存並關閉


您應該嘗試使用選項-i進行就地編輯。


有了上述正確答案的所有應有的尊重,這樣的“幹運行”腳本總是一個好主意,這樣你就不會損壞你的文件,而必須從頭開始重新開始。

例如,讓腳本將輸出洩露到命令行而不是將其寫入文件中,例如:

sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

要么

less index.html | sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g 

通過這種方式,您可以查看並檢查命令的輸出而不會截斷您的文件。


shell在命令行中看到> index.html ,它會打開文件index.html進行寫入 ,並清除其之前的所有內容。

要解決此問題,您需要將-i選項傳遞給sed以進行內聯更改並在原地進行更改之前創建原始文件的備份:

sed -i.bak s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html

如果沒有.bak,該命令將在某些平台(例如Mac OSX)上失敗。


要更改多個文件(並將每個文件的備份另存為* .bak):

perl -p -i -e "s/\|/x/g" *  

將採取目錄中的所有文件並替換|x這稱為“Perl派”(容易如餡餅)


除了sed-i選項外,你還可以使用tee工具

man

tee - 從標準輸入讀取並寫入標準輸出和文件

所以,解決方案將是:

sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee index.html

sed -i.bak "s#https.*\.com#$pub_url#g" MyHTMLFile.html

如果您有要添加的鏈接,請嘗試此操作。 按上述方式搜索URL(以https開頭並以.com結尾),並將其替換為URL​​字符串。 我在這裡使用了一個變量$pub_url 。 這裡意味著搜索和g意味著全球替代。

有用 !





sed