我有一个带有<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>