使用sed替換多行字串


介紹

Sed,或流編輯器,是一個強大的命令列工具,允許你操作和轉換文字檔案。你可能需要執行的最常見任務之一是用另一個字串替換檔案中的多行字串。在本文中,我們將探討如何使用sed來完成此任務。

理解Sed的s命令

Sed的s命令是你執行文字替換將要使用的主要工具。它採用以下形式:

s/pattern/replacement/flags

這裡,pattern是一個匹配你想要替換的文字的正則表示式,replacement是你想要替換它的文字,flags是修改命令列為的可選標誌。

使用Sed替換多行字串

預設情況下,sed逐行操作,這意味著它獨立地匹配模式並在每一行上執行替換。但是,只需一點技巧,我們也可以使用sed來替換多行字串。

假設我們在名為example.txt的檔案中有多行字串:

This is a multi-line
string that we want to replace
with a new string.

要將此字串替換為新字串,我們可以使用以下sed命令:

sed -i ':a;N;$!ba;s/This is a multi-line
string that we want to replace
with a new string\./New string/g' example.txt

讓我們分解一下這個命令:

  • -i標誌告訴sed就地編輯檔案,這意味著它將用修改後的版本覆蓋原始檔案。

  • :a;N;$!ba; 命令是一個sed習慣用法,它將整個檔案讀入模式空間,而不是逐行處理它。

  • s/This is a multi-line
    string that we want to replace
    with a new string\./New string/g 命令用新字串替換多行字串。

請注意,我們需要使用
來表示我們想要匹配的模式中的換行符。

使用變數使命令更易讀

我們剛剛使用的sed命令很長且難以閱讀。為了使它更易讀,我們可以使用變數來表示我們想要匹配和替換的字串。

例如,假設我們想要替換以下多行字串:

Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua.

我們可以像這樣定義舊字串和新字串的變數:

OLD_STRING="Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua." NEW_STRING="New string"

然後像這樣在我們的sed命令中使用它們:

sed -i ":a;N;$!ba;s/${OLD_STRING}/${NEW_STRING}/g" example.txt

使用正則表示式匹配多個字串

如果我們想替換檔案中的多個字串,但我們不知道這些字串是什麼呢?在這種情況下,我們可以使用正則表示式來匹配涵蓋我們想要替換的所有字串的模式。

例如,假設我們有一個包含電子郵件地址列表的檔案,如下所示:

user1@example.com
user2@example.com
user3@example.com

我們想用一個新的電子郵件地址替換此檔案中的所有電子郵件地址,但我們不知道舊的電子郵件地址是什麼。

在這種情況下,我們可以使用正則表示式來匹配檔案中的所有電子郵件地址,如下所示:

sed -i 's/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/newemail@example.com/g' example.txt

讓我們分解一下這個命令:

  • 正則表示式[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} 匹配所有有效的電子郵件地址。

  • s/ 命令將匹配的模式替換為newemail@example.com。

  • g標誌告訴sed全域性執行替換,這意味著它替換檔案中模式的所有出現。

使用保持緩衝區保留資料

有時,當我們使用sed執行替換時,我們希望保留我們正在替換的一些資料。例如,假設我們有一個包含姓名和電話號碼列表的檔案,如下所示:

John Smith: (123) 456-7890
Jane Doe: (555) 555-1212

我們想用一個新的電話號碼替換電話號碼,但我們想保留姓名。為此,我們可以使用保持緩衝區,這是sed中一個特殊的緩衝區,允許我們保留資料以供以後使用。

我們可以使用以下sed命令來替換電話號碼為新的電話號碼,同時保留姓名:

sed -i -e '/^.*:/{' -e 'h;s/[^:]*: //;s/([0-9]{3}) [0-9]{3}-[0-9]{4}/(555) 555-1234/;G;s/
/: /}' example.txt

讓我們分解一下這個命令:

  • -e標誌允許我們指定多個sed命令。

  • /^.*:/ 正則表示式匹配任何包含冒號的行。

  • h命令將匹配的行儲存到保持緩衝區。

  • s/[^:]*: // 命令從行中刪除姓名。

  • s/([0-9]{3}) [0-9]{3}-[0-9]{4}/(555) 555-1234/ 命令將電話號碼替換為新的電話號碼。

  • G命令將保持緩衝區的內容附加到模式空間。

  • s/
    /: / 命令將姓名添加回行中,用冒號和空格分隔。

使用Sed替換多行字串

在某些情況下,你可能需要用另一個多行字串替換多行字串。這可能比簡單地替換一行文字要棘手一些,但sed可以透過一些特殊的命令來實現。

假設我們有一個名為example.txt的檔案,其中包含以下多行字串:

This is a multi-line
string that we want to
replace with another
multi-line string.

我們想用以下多行字串替換此字串:

Here is our new
multi-line string
that we will use
to replace old one.

我們可以使用以下sed命令來實現:

sed -i -e ':a;N;$!ba;s/This is a multi-line
string that we want to
replace with another
multi-line string\./Here is our new
multi-line string
t that we will use
to replace old one\./g' example.txt

讓我們分解一下這個命令:

  • -e標誌允許我們指定多個sed命令。

  • :a;N;$!ba 命令將整個檔案讀入模式空間。

  • s/This is a multi-line
    string that we want to
    replace with another
    multi-line string\./Here is our new
    multi-line string
    t that we will use
    to replace old one\./g 命令用新的多行字串替換舊的多行字串。

使用Sed使用正則表示式匹配多個字串

在某些情況下,你可能需要使用單個sed命令匹配多個字串。這可以透過使用正則表示式來實現。

例如,假設我們有一個名為example.txt的檔案,其中包含以下幾行:

This is first line.
This is second line.
This is third line.

我們想用單詞“sentence”替換單詞“line”的所有例項。我們可以使用以下sed命令來實現:

sed -i 's/line/sentence/g' example.txt

讓我們分解一下這個命令:

  • s/line/sentence/g 命令匹配單詞“line”的所有例項,並將其替換為單詞“sentence”。

使用Sed刪除空行

在某些情況下,你可能需要從檔案中刪除空行。這可以透過使用sed來實現。

例如,假設我們有一個名為example.txt的檔案,其中包含以下幾行:

This is first line.
This is second line.
This is third line.

我們想從檔案中刪除所有空行。我們可以使用以下sed命令來實現:

sed -i '/^$/d' example.txt

讓我們分解一下這個命令:

  • /^$/d 命令匹配所有為空的行(即僅包含換行符的行),並將其刪除。

使用Sed在一個命令中替換多個字串

在某些情況下,你可能需要在一個sed命令中替換多個字串。這可以透過使用多個用分號分隔的s命令來實現。

例如,假設我們有一個名為example.txt的檔案,其中包含以下幾行:

This is first line.
This is second line.
This is third line.

我們想用單詞“sentence”替換單詞“line”的所有例項,並用單詞“initial”替換單詞“first”的所有例項。我們可以使用以下sed命令來實現:

sed -i 's/line/sentence/g;s/first/initial/g' example.txt

讓我們分解一下這個命令:

  • s/line/sentence/g 命令匹配單詞“line”的所有例項,並將其替換為單詞“sentence”。

  • s/first/initial/g 命令匹配單詞“first”的所有例項,並將其替換為單詞“initial”。

結論

Sed是一個強大的工具,用於執行文字替換和轉換。在本文中,我們探討了如何使用sed替換多行字串、使用變數使命令更易讀、使用正則表示式匹配多個字串以及使用保持緩衝區保留資料。使用這些技術,你可以有效地操作和轉換文字檔案以滿足你的需求。

更新於:2023年3月23日

10K+ 瀏覽量

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.