Linux

Linux 以 sed 指令搜尋、取代檔案內容教學與範例

介紹如何在 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

Share
Published by
Office Guide
Tags: Bash

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago