使用 sed
轉換文字
1. sed 命令的語法
什麼是 sed
?
sed
(是 Stream Editor,流編輯器 的縮寫)是一個非常強大的文本處理工具,可以用來修改、添加、刪除或轉換文本文件和數據流中的行。
sed
的主要魔法在於它可以在不更改原始文件的情況下「即時」編輯文本(當然,除非你自己要求它覆蓋原始文件)。這讓它成為快速自動化轉換數據的理想工具。
命令的基本語法
讓我們來看看使用 sed
的基本公式:
sed [選項] '模式/動作' 檔案
其中:
模式
— 是您要搜索的文本或正則表達式。動作
— 您希望執行的操作(例如,文本替換)。檔案
— 包含您想要修改的行的文本檔案。
為了簡化操作,我們一開始會專注於最受歡迎的兩個動作:替換文本(s
,來自 "substitute")和刪除行(d
,來自 "delete")。
2. 替換文字 s/舊的/新的/
範例 1: 基本的文字替換
假設我們有個檔案 example.txt
,內容如下:
Hello world!
Welcome to Linux.
Linux is awesome.
試試將單字 "Linux" 替換為 sed
:
sed 's/Linux/sed/' example.txt
輸出結果如下:
Hello world!
Welcome to sed.
sed is awesome.
就這樣!單字 "Linux" 在每一行中只會被替換一次。這是預設行為。
範例 2: 全域替換
如果需要將所有的單字替換(而不只是每行中第一次出現的),可以加上 g
(全域)旗標:
sed 's/Linux/sed/g' example.txt
如果一行中有多個 "Linux",它們都會被替換成 sed
。
範例 3: 忽略大小寫
若要忽略大小寫進行文字替換,可加上 I
或 i
(視版本而定):
sed 's/linux/sed/gi' example.txt
這會替換 "Linux"、"LINUX"、"LiNuX" 等等。
範例 4: 替換並保存結果
預設情況下,sed
只會將結果輸出到控制台,不會更改檔案。如果你想將更改保存到檔案中,可以加上 -i
(in-place)選項:
sed -i 's/Linux/sed/g' example.txt
這樣檔案 example.txt
將會被更新為新的內容。
3. 刪除行 /模板/d
範例 1: 根據模板刪除行
如果你想刪除所有包含 "Linux" 這個詞的行:
sed '/Linux/d' example.txt
輸出會是這樣的:
Hello world!
這裡刪除了包含 "Linux" 的行。
根據行號刪除行
你可以根據行號刪除某行。例如,想刪除第二行,可以使用:
sed '2d' example.txt
輸出:
Hello world!
Linux is awesome.
刪除多行:指定範圍,例如刪除第 2 到第 3 行:
sed '2,3d' example.txt
4. 使用正則表達式
這就是 sed
發揮威力的地方!在樣式裡可以用正則表達式來找更複雜的匹配。
範例 1: 替換符合特定樣式的詞
假設文本中有這樣的行:
error: something went wrong
warning: check your system
error: unable to connect
我們想把所有以 "error" 開頭的行替換成 "Issue Detected"。這時正則表達式就派上用場了:
sed 's/^error:.*/Issue Detected/' logs.txt
其中:
^
— 指向行的開頭。.*
— 表示 "後面任何東西"。
結果:
Issue Detected
warning: check your system
Issue Detected
5. 插入與新增行
在匹配前插入一行
如果想在每一行包含 "Linux" 的行之前插入一行:
sed '/Linux/i\# Learning is fun' example.txt
結果:
Hello world!
Welcome to Linux.
# Learning is fun
Linux is awesome.
範例 2: 在匹配後新增一行
如果想在匹配到的行後新增文本:
sed '/Linux/a\# sed makes it easier' example.txt
結果:
Hello world!
Welcome to Linux.
# sed makes it easier
Linux is awesome.
# sed makes it easier
6. 實踐:配置文件處理
我們來嘗試解決一個實際問題。假設你有一個配置文件 config.txt
:
host=localhost
port=8080
mode=production
logfile=/var/log/app.log
任務 1:將 "localhost" 替換為 "127.0.0.1"
sed -i 's/localhost/127.0.0.1/' config.txt
結果:
host=127.0.0.1
port=8080
mode=production
logfile=/var/log/app.log
任務 2:將端口號增加1
為此我們用一個小技巧結合 sed
:
sed -i 's/port=8080/port=8081/' config.txt
結果:
host=127.0.0.1
port=8081
mode=production
logfile=/var/log/app.log
任務 3:刪除含有 logfile
的行
如果配置不再需要記錄日誌,刪除這行:
sed -i '/logfile/d' config.txt
結果:
host=127.0.0.1
port=8081
mode=production
7. 與其他命令的組合
sed
和其他 Linux 工具配合得很好。例如:
grep "error" logs.txt | sed 's/error/ERROR/'
在這裡,我們先找到包含錯誤的行,然後格式化它們。
常見錯誤以及如何避免
- 錯誤:忘記了選項
-i
。 初學者經常希望sed
能改變文件,但卻沒有添加-i
。如果你想直接修改文件,記得一定要顯式指定這個選項。 - 錯誤:引號問題。 在一些系統中,特別是使用單引號的時候,
\
用於特殊字符可能不正常工作。一定要正確地轉義字符。 - 錯誤:行範圍的處理問題。 當你使用範圍(例如
2,3d
)時,請確認它們是正確的,否則文件可能會被完全清空。
GO TO FULL VERSION