介紹如何在 Linux 系統下使用一行 sed
指令搜尋並取代檔案內容。
sed
指令非常適合用來快速更改各種系統設定檔的內容,以下是一些常見的範例。
sed
可以使用 -e
參數指定要執行的編輯指令,例如將整個 input.txt
檔案中所有的 word1
都取代為 word2
,並將結果輸出至 output.txt
:
# 將 word1 取代為 word2 sed -e 's/word1/word2/g' input.txt > output.txt
當 sed
指搭配單一個 -e
參數時,可以將 -e
省略,變成更簡潔的寫法:
# 將 word1 取代為 word2 sed 's/word1/word2/g' input.txt > output.txt
如果要同時取代多組文字,可以使用多個 -e
參數指定取代的規則:
# 將 word1 取代為 word2、將 dog 取代為 cat sed -e 's/word1/word2/g' -e 's/dog/cat/g' input.txt > output.txt
如果只希望 sed
只將每一行之中找到的第一個 word1
取代為 word2
,其餘的都不管,可以將 g
修飾符拿掉:
# 將每一行找到的第一個 word1 取代為 word2 sed 's/word1/word2/' input.txt > output.txt
而如果只要將每一行之中找到的第二個 word1
取代為 word2
,可以加入 2
這個修飾符(若要取代第三個則改為 3
,以此類推):
# 將每一行找到的第二個 word1 取代為 word2 sed 's/word1/word2/2' input.txt > output.txt
若希望在搜尋文字時不分大小寫,可以加上 i
修飾符:
# 不分大小寫 sed -e 's/word1/word2/gi' input.txt > output.txt
sed
預設會將取代的結果輸出至標準輸出(standard output),如果希望直接將編輯原始檔案,直接將結果取代原本的內容,可以加上 -i
參數:
# 直接編輯原始檔案,取代原本內容 sed -i -e 's/word1/word2/g' input.txt
如果擔心不小心輸入錯誤的指令,將重要資料覆蓋掉,可以在 -i
參數後方加上備份檔案的後綴,這樣就會自動將原始內容保留一份備份檔案:
# 直接編輯原始檔案,取代原本內容(保留 .bak 備份檔) sed -i.bak -e 's/word1/word2/g' input.txt
以這個例子來說,執行完之後會產生新的 input.txt
,而原始的檔案內容則會放在 input.txt.bak
備份檔案中。
如果只想對檔案中的某些行(line)進行搜尋與取代,可以在 sed
指令之前指定範圍:
# 只對第 5 行進行搜尋與取代 sed -e '5s/word1/word2/g' input.txt > output.txt # 只對第 5 行至第 15 行進行搜尋與取代 sed -e '5,15s/word1/word2/g' input.txt > output.txt
在處理系統設定檔或程式碼的取代動作時,可能會需要跳過註解內容,只對程式碼的部分進行取代,這時候就可以先以正規表示法進行匹配,匹配成功之後再進行取代。例如只對非井字號(#
)開頭的行進行取代:
# 只對非 # 開頭的行進行取代 sed -e '/^[^#]/s/word1/word2/g' input.txt > output.txt
若要修改系統設定檔中的指定參數,除了跳過註解之外,通常還可以加上參數名稱的匹配,只對含有特定參數名稱的那一行進行取代,例如只針對含有 MY_PARAM
這個字樣的行進行搜尋與取代:
# 只對非 # 開頭、且含有 MY_PARAM 的行進行取代 sed -e '/^[^#]*MY_PARAM/s/word1/word2/' input.txt > output.txt
若要轉換英文的大小寫,可以搭配 \U
與 \L
來處理:
# 將所有英文字轉為大寫 sed -e 's/.*/\U&/' input.txt > output.txt # 將所有英文字轉為小寫 sed -e 's/.*/\L&/' input.txt > output.txt # 將第一行中的英文字轉為小寫 sed -e '1s/.*/\L&/' input.csv > output.csv
參考資料:nixCraft