使用帶有正規表示式的 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
如你所見,9876
被 number
字串替換。
最後但同樣重要的是,每當你使用 sed
編輯檔案時,你應該始終進行備份。給 -i
選項一個備份檔案的副檔名來完成這個。
例如,編輯 live.txt
並將原始檔案儲存為 live.txt
。如果你要使用 bak
,你可以通過以下方式做到這一點:
$ sed -i.bak 's/Omicron/thanos/g' live.txt
使用 ls
命令列出檔案以確保已建立備份:
$ ls
輸出:
live.txt
live.txt.bak
雖然一開始可能看起來很複雜,但使用 sed
查詢和更改檔案中的文字相對簡單。