CodeGym /Adesua ahorow /Docker SELF /使用 sed 轉換文字

使用 sed 轉換文字

Docker SELF
等級 8 , 課堂 1
開放

使用 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: 忽略大小寫

若要忽略大小寫進行文字替換,可加上 Ii(視版本而定):

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)時,請確認它們是正確的,否則文件可能會被完全清空。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION