替换 HTML 文件中的多行模式

To *_* Do 4 linux sed find-and-replace

我有一系列 HTML 文件,其中包含如下两行:

<body>
<h1>Title</h1><p>
<a href="url">Description</a><br>
Run Code Online (Sandbox Code Playgroud)

我想使用 bash 脚本用其他内容替换此文本。我想

sed -i -r 's/<h1>Title.*?$\/^.*?<br>/Replacement text/1' filename.html
Run Code Online (Sandbox Code Playgroud)

但它不起作用。我怀疑它卡在新线路上,不知道如何解决这个问题。

任何帮助表示赞赏。随意推荐其他 Linux 工具sed,只要它可以工作!

slh*_*hck 9

我会为此使用 Perl:

perl -0pe 's/<h1>Title.*\n.*<br>/replacement/' filename.html
Run Code Online (Sandbox Code Playgroud)

在这里,-0让 Perl 在NUL字符上拆分记录而不是逐行读取,这是使用该-p选项时的默认设置。

使用 Perl 正则表达式,您需要.* 多次匹配任何字符,并将换行符与\n.

例子:

$ echo '<body>
<h1>Title</h1><p>
<a href="url">Description</a><br>' | perl -0pe 's/<h1>Title.*\n.*<br>/replacement/'
<body>
replacement
Run Code Online (Sandbox Code Playgroud)

  • @ToDo Perl 可以使用 `-i` 选项进行就地编辑,所以运行 `perl -0p -i~ -e 's/.../.../'` 让它编辑原始文件,创建一个备份副本`~` 作为后缀。或者,要在没有备份文件的情况下进行替换,请调用 `perl -0pi -e ...`。 (3认同)
  • 这*几乎*好。我加了一个?在两个 .* 之后禁用贪婪。是否可以让命令修改文件而不是输出到 STDOUT? (2认同)