使用 Perl 或 sed 删除多个 HTML 匹配行之前的所有内容

使用 Perl 或 sed 删除多个 HTML 匹配行之前的所有内容

我希望使用 Perl 或 sed 命令删除当前文件夹中所有文件中多个 HTML 匹配行之前的所有内容。

这是当前文件夹中我的文件之一的样子:

<li>violet</li>
<p>red</p>
<p>blue</p>
<p>gray</p>

<li><a href="#part1">Part 1</a>

</li>
<h2>Part 1</h2>
<p>pink</p>

我试图在匹配这些 HTML 行之前删除所有内容(如您所见,其中可能包含空行):

<li><a href="#part1">Part 1</a>

</li>

所以最终编辑的文件将如下所示:

<h2>Part 1</h2>
<p>pink</p>

我发现 Perl 可以使用以下命令删除特定字符之前的所有内容:

perl -p -e 's/^.*?abc/abc/'

和 sed:

sed 's/[^abc]*\(abc.*\)/\1/'

但我无法将这些与 html 标签匹配。

如果有人有任何建议,那就太棒了!

答案1

我不会用正则表达式解析 HTML,但只是基于“在并包括之后打印内容<h2>”,你可以这样做,

perl -nE'state $start ||= m?<h2>? and print' ./test

即使在 Perl 中你也不会使用正则表达式。你会用一些东西Mojo::DOM做你想做的事,而不是正则表达式。

相关内容