Linux 中文字檔案的遞迴搜尋和替換


在任何作業系統中,最基本且最常執行的任務之一就是搜尋和替換。在處理文字檔案時,這一點變得更加重要,因為同一個單詞或短語的多個例項可能散佈在整個文件中。在這種情況下,手動編輯每個例項既費時又容易出錯。在這種情況下,像 Linux 中的遞迴搜尋和替換這樣的工具就派上用場了。

在 Linux 中,可以透過多種方法進行遞迴搜尋和替換。最常見的一種方法涉及使用命令列工具,例如 Sed、Awk 和 Perl。這些工具高效、輕量級,並且已經存在了幾十年,使它們成為文字編輯的可靠選擇。在本文中,我們將討論如何使用這些工具執行遞迴搜尋和替換。

什麼是遞迴搜尋和替換?

遞迴搜尋和替換是指在多個檔案或目錄中搜索特定單詞或短語,然後將其替換為另一個單詞或短語的過程。它被稱為“遞迴”,因為該過程會重複應用於父目錄的每個子目錄,直到替換了單詞或短語的所有例項。在處理大型文字檔案或包含多個檔案的目錄時,這很有用,因為它可以節省時間和精力。

如何在 Linux 中執行遞迴搜尋和替換

在 Linux 中執行遞迴搜尋和替換的方法有很多。在本文中,我們將介紹使用 Sed、Awk 和 Perl 的最常用的方法。

使用 Sed

Sed(流編輯器)是一個功能強大的命令列工具,用於編輯文字檔案。它可以用於執行各種文字操作任務,包括遞迴搜尋和替換。使用 Sed 的基本語法如下:

sed 's/old_text/new_text/g' file_name

“s”命令代表“替換”,後跟舊文字、新文字和檔名。“g”選項代表全域性,這意味著檔案中舊文字的所有例項都將被替換為新文字。

要使用 Sed 執行遞迴搜尋和替換,我們需要使用“-r”選項(啟用擴充套件正則表示式)和“-i”選項(啟用就地編輯)。使用 Sed 進行遞迴搜尋和替換的語法如下:

find . -type f -name '*.txt' -exec sed -i -r 's/old_text/new_text/g' {} +

“find”命令用於查詢檔案和目錄,“-type f”選項用於僅查詢檔案。“-name”選項用於指定副檔名,在本例中為“*.txt”。“-exec”選項用於對找到的每個檔案執行命令。然後將命令傳遞給 Sed,Sed 執行遞迴搜尋和替換。

示例

假設我們有一個名為“test”的目錄,其中包含兩個子目錄“subdir1”和“subdir2”,每個子目錄中都包含一個名為“file.txt”的檔案。“subdir1”中“file.txt”的內容如下:

The quick brown fox jumps over lazy dog.
The quick brown fox is a common phrase in English.

“subdir2”中“file.txt”的內容如下:

The quick brown fox is a common phrase in English.
The quick brown fox is also a song.

要使用 Sed 執行遞迴搜尋和替換,我們需要執行以下命令:

find test/ -type f -name '*.txt' -exec sed -i -r 's/quick/brown/g' {} +

此命令將替換“test”目錄及其子目錄中所有“.txt”檔案中“quick”單詞的所有例項為“brown”。結果如下:

替換後“subdir1”中“file.txt”的內容:

The brown brown fox jumps over lazy dog.
The brown brown fox is a common phrase in English.

替換後“subdir2”中“file.txt”的內容:

The brown brown fox is a common phrase in English.
The brown brown fox is also a song.

使用 Awk

Awk 是另一個功能強大的命令列工具,用於文字處理。它特別適用於處理結構化文字檔案。使用 Awk 的基本語法如下:

awk '{gsub(/old_text/, "new_text"); print}' file_name

“gsub”函式代表“全域性替換”,後跟舊文字、新文字和檔名。“print”函式用於將修改後的文字列印到控制檯。

要使用 Awk 執行遞迴搜尋和替換,我們需要使用與 Sed 示例中相同的“find”命令。使用 Awk 進行遞迴搜尋和替換的語法如下:

find . -type f -name '*.txt' -exec awk '{gsub(/old_text/, "new_text"); print > FILENAME}' {} +

“FILENAME”變數用於指示正在處理的當前檔案。然後使用“>”運算子將修改後的文字重定向迴文件。

示例

使用與 Sed 示例中相同的目錄結構和檔案內容,我們可以透過執行以下命令使用 Awk 執行遞迴搜尋和替換:

find test/ -type f -name '*.txt' -exec awk '{gsub(/quick/, "brown"); print > FILENAME}' {} +

此命令將替換“test”目錄及其子目錄中所有“.txt”檔案中“quick”單詞的所有例項為“brown”。結果與 Sed 示例相同。

使用 Perl

Perl(實用提取和報告語言)是另一個功能強大的指令碼語言,用於文字處理。它廣泛用於 Web 開發、系統管理和網路程式設計。使用 Perl 的基本語法如下:

perl -pi -e 's/old_text/new_text/g' file_name

“-pi”選項啟用就地編輯,“-e”選項用於指定要執行的指令碼。“s”函式代表“替換”,後跟舊文字、新文字和檔名。“g”選項代表全域性,這意味著檔案中舊文字的所有例項都將被替換為新文字。

要使用 Perl 執行遞迴搜尋和替換,我們需要使用與 Sed 和 Awk 示例中相同的“find”命令。使用 Perl 進行遞迴搜尋和替換的語法如下:

find . -type f -name '*.txt' -exec perl -pi -e 's/old_text/new_text/g' {} +

示例

使用與 Sed 和 Awk 示例中相同的目錄結構和檔案內容,我們可以透過執行以下命令使用 Perl 執行遞迴搜尋和替換:

find test/ -type f -name '*.txt' -exec perl -pi -e 's/quick/brown/g' {} +

此命令將替換“test”目錄及其子目錄中所有“.txt”檔案中“quick”單詞的所有例項為“brown”。結果與 Sed 和 Awk 示例相同。

結論

在本文中,我們探討了三種不同的命令列工具,用於在 Linux 中的文字檔案中執行遞迴搜尋和替換 - Sed、Awk 和 Perl。每種工具都有其獨特的語法和功能,但它們都非常強大且高效,可用於文字處理。

能夠在文字檔案中執行遞迴搜尋和替換是任何 Linux 系統管理員、程式設計師或高階使用者的必備技能。無論您是在處理小型專案還是大型部署,快速輕鬆地修改文字檔案的能力都可以節省大量時間。

透過掌握這些工具和技術,您可以提高工作效率,並在過程中節省大量時間和麻煩。所以,趕快自己嘗試一下,看看您的工作變得多麼輕鬆!

更新於: 2023年3月14日

3K+ 閱讀量

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告