使用sed替换多行字符串


介绍

Sed,或流编辑器,是一个强大的命令行工具,允许你操作和转换文本文件。你可能需要执行的最常见任务之一是用另一个字符串替换文件中的多行字符串。在本文中,我们将探讨如何使用sed来完成此任务。

理解Sed的s命令

Sed的s命令是你执行文本替换将要使用的主要工具。它采用以下形式:

s/pattern/replacement/flags

这里,pattern是一个匹配你想要替换的文本的正则表达式,replacement是你想要替换它的文本,flags是修改命令行为的可选标志。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

使用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+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告