使用 sed 在多行标签周围放置大括号<p>,并在到达 <h1>、 <h2><h3>时停止



我有一个带有<p>, <h1>, <h2><h3>标记的HTML文件。我需要使<p>标记在大括号中,如果它们是每行上的后续<p>标记,则大括号应该从第一个实例开始,并在结束</p>标记处结束大括号,即使它是几行。

内容示例:

<p>Paragraph 1</p>
<p>Paragraph 2</p>
<p>Paragraph 3</p>
<h1>Heading 1</h1>
<p>Paragraph 4</p>
<h3>Heading 2</h3>
所需输出:

{<p>Paragraph 1</p>
<p>Paragraph 2</p>
<p>Paragraph 3</p>}
<h1>Heading 1</h1>
{<p>Paragraph 4</p>}
<h3>Heading 2</h3>

请注意,在期望的输出中,右括号是在行交换为<h1>时。后续<p>标签的数量可以在2到20之间。

我目前的sed解决方案只是用一个左括号替换开始的<p>标签,并用一个右括号关闭</p>标签。

sed 's|<p>|{|g' | sed 's|</p>|}|g'

不幸的是,这是逐行,我需要的是匹配多行,并忽略关闭/开始标记,如果它们后面跟着另一个<p>标记,以便它们集中在一起。

我还没能找到解决这个问题的办法。我很乐意使用perl、awk、sed等任何可以完成工作的工具。似乎我需要一种方法来识别这种特殊的模式。

编辑:Ed Morton的解决方案对我来说非常有效。

$ cat tst.awk
/^<p/ {
    ps = (ps == "" ? "" : ps ORS) $0
    next
}
ps != "" { print "{" ps "}"; ps="" }
{ print }
END { if (ps != "") print "{" ps "}" }

$ awk -f tst.awk file
{<p>Paragraph 1</p>
<p>Paragraph 2</p>
<p>Paragraph 3</p>}
<h1>Heading 1</h1>
{<p>Paragraph 4</p>}
<h3>Heading 2</h3>

最新更新