使用帶有正規表示式的 sed 查詢和替換複雜字串

Nilesh Katuwal 2023年1月30日
  1. 在 Bash 中使用 sed 查詢和替換字串
  2. 在 Bash 中的字串中查詢和替換分隔符 /
  3. 查詢所有數字並用 Bash 中的字串數字替換它們
使用帶有正規表示式的 sed 查詢和替換複雜字串

處理文字檔案時,你經常需要識別和替換一個或多個檔案中的文字字串。

sed 是一個流編輯器。它可以對檔案和輸入流(如管道)執行基本的文字操作。你可以使用 sed 搜尋、查詢和替換單詞和行,以及插入和刪除它們。

支援基本和擴充套件的 regex,允許你匹配複雜的模式。在這篇文章中,我們將瞭解如何使用 sed 查詢和替換字串。我們還將演示如何使用遞迴搜尋和替換。

在 Bash 中使用 sed 查詢和替換字串

sed 有多種版本,每個版本都有其特點。

Linux 發行版預設預裝了 GNU sed,但 Mac OS 使用 BSD 版本。我們將使用 GNU 版本。

該語法用於使用 sed 搜尋和替換文字:

sed -e 's/Search_Regex/substitution/g' Filename

在上面使用的語法中,定義如下:

  • -e 是預設寫入標準輸出的 sed 輸出。該引數指示 sed 在當前位置編輯檔案。如果定義了副檔名,則會生成替換檔案。
  • /// 是用作分隔符的字元。儘管大多數人使用斜線 (/) 字元,但它可以是任何字元。
  • Search_Regex 是一個搜尋的東西。我們將使用 regex 或常規字串。
  • substitution 用作要替換的字串。
  • g 是全域性替換的標誌。sed 預設逐行讀取檔案,並且僅更改每行中第一次出現的 Search_Regex。當設定替換標誌時,所有例項都會被替換。
  • Filename 是應該執行命令的檔名。

讓我們看一下使用 sed 命令搜尋和替換檔案中的文字的常用引數和標誌。我們將使用我們為演示目的建立的示例檔案,即 live.txt

live.txt 
Omicron is the endgame of Covid and Omicron 9876

如果 g 標誌被忽略,則僅替換每行中搜尋字串的第一個例項。

$ sed -e 's/endgame/infinitywar/' live.txt

輸出:

Omicron is the infinitywar of Covid and Omicron 9876

sed 用全域性替換標誌替換所有出現的搜尋模式:

$ sed -e 's/Omicron/thanos/g' live.txt

輸出:

thanos is the endgame of Covid and thanos 9876

正如你可能已經觀察到的,字串 Omicron 已被替換為 thanos

在 Bash 中的字串中查詢和替換分隔符 /

如果要發現和替換包含分隔符/ 的字串,你必須使用反斜槓\ 來轉義斜槓。例如,要將 /bin/bash 替換為 /usr/bin/zsh,請使用以下命令:

$ sed -e 's/\/bin\/bash/\/usr\/bin\/zsh/g' live.txt

輸出:

Omicron is the endgame of Covid and Omicron 9876

讓我們使用豎線|讓我們更容易理解或冒號:,儘管任何其他字元就足夠了。

$ sed -e 's|/bin/bash|/usr/bin/zsh|g' live.txt

輸出:

Omicron is the endgame of Covid and Omicron 9876

如你所見,結果與前一個相同。

查詢所有數字並用 Bash 中的字串數字替換它們

正規表示式還可以找到所有四個數字並將它們替換為字串數字。例如:

$ sed -e 's/\b[0-9]\{4\}\b/number/g' live.txt

輸出:

Omicron is the endgame of Covid, and Omicron number

如你所見,9876number 字串替換。

最後但同樣重要的是,每當你使用 sed 編輯檔案時,你應該始終進行備份。給 -i 選項一個備份檔案的副檔名來完成這個。

例如,編輯 live.txt 並將原始檔案儲存為 live.txt。如果你要使用 bak,你可以通過以下方式做到這一點:

$ sed -i.bak 's/Omicron/thanos/g' live.txt

使用 ls 命令列出檔案以確保已建立備份:

$ ls

輸出:

live.txt
live.txt.bak 

雖然一開始可能看起來很複雜,但使用 sed 查詢和更改檔案中的文字相對簡單。