如何在 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
文件夹中的所有文本文件,并在每个文件中应用多行字符串替换。