如何在 Linux 上搜索和替换文件中的多行字符串如何在 Linux 上搜索和替换文件中的多行字符串如何在 Linux 上搜索和替换文件中的多行字符串如何在 Linux 上搜索和替换文件中的多行字符串
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上搜索和替换文件中的多行字符串

问题:我有一个文本文件,我想将其中的多行文本更改为其他内容,但不使用文本编辑器。有没有办法从 Linux 命令行查找并替换多行字符串模式?

假设您有一个如下所示的文本文件。


Beginning of a text file.

This is a cat.
This is a dog.
This is a guinea pig.
This is a gecko.
This is a hamster.
This is a parrot.
This is a rabbit.
This is a ferret.
This is a turtle.

您想要将突出显示的多行替换为以下一行,但不使用文本编辑器。


Beginning of a text file.

This is a cat.
This is a dog.
These were removed.
This is a parrot.
This is a rabbit.
This is a ferret.
This is a turtle.

搜索并替换多行字符串模式

当查找和替换多行字符串模式时,Perl 基于正则表达式的模式匹配会派上用场。

下面的一句话就可以完成这项工作。


$ perl -i -0pe 's/<multi-line-string-pattern>/<replacement-string>/' input.txt

上面表达式中的一些注释:

  • -i 选项告诉 Perl 执行就地编辑,这意味着 Perl 读取输入文件,进行替换,并将结果写回同一输入文件。如果您想试运行更改,则可以省略此选项,在这种情况下,结果将显示到 stdout 而不修改输入文件。

  • -0 选项将 Perl 转变为“file slurp”模式,其中 Perl 一次性读取整个输入文件(而不是逐行读取)。这使得多行搜索和替换成为可能。

  • -pe 选项允许您运行 Perl 代码(在本例中为模式匹配和替换)并显示命令行的输出。

在此特定示例中,以下命令将根据需要替换多行字符串,并显示结果(而不将更改应用于输入文件)。


$ perl -0pe 's/This is a guinea pig.nThis is a gecko.nThis is a hamster.n/These were removed.n/' input.txt

一旦确认结果正确,您可以通过添加 -i 选项将更改应用到输入文件:


$ perl -i -0pe 's/This is a guinea pig.nThis is a gecko.nThis is a hamster.n/These were removed.n/' input.txt

以下是一些变化:

要以不区分大小写的方式查找多行字符串模式:


$ perl -i -0pe 's/<multi-line-string-pattern>/<replacement-string>/i' input.txt

要删除多行字符串模式:


$ perl -i -0pe 's/<multi-line-string-pattern>//' input.txt

在多个文件中搜索并替换多行字符串

如果要在多个文件中查找并替换多行字符串,可以结合使用 find 和 xargs,如下所示。


$ find ~/doc -name "*.txt" | xargs perl -i -0pe 's/<multi-line-string-pattern>/<replacement-string>/'

此单行搜索 ~/doc 文件夹中的所有文本文件,并在每个文件中应用多行字符串替换。

©2015-2025 艾丽卡 support@alaica.com