类似于 sed 的工具,用于在 <div id="jsn-page">...</div> 之后插入 HTML 片段代码(div 块)

Tool sed-like to insert a HTML snippet code (a div block) after a <div id="jsn-page">...</div>

我正在寻找一种在块 <div id="jsn-body">...</div> 之后插入块 <div id="jsn-content-bottom">...code...</div> 的方法。

我想使用 shell 脚本,因为我需要将此插入应用于递归目录中的多个 HTML 文件。

在第一次尝试中,我尝试使用 sed。但问题是我不知道如何找到与打开标签 <div id="jsn-body"> 相对应的正确结束标签 </div>。事实上,<div id="jsn-body"> 块内还有多个其他 <div> 标签,我需要找到这个结束标签(也许它的行号就足够了),因为我想在 <div id="jsn-content-bottom">...code...</div> 之后插入块这个结束标记。

任何人都可以看到如何轻松找到此结束标记的行(当我这么说时,我想在我的 shell 脚本中使用 sed 但我对其他工具开放或 Linux 命令,使 HTML 文件的处理更容易)。

最后一件事,我希望将插入的块存储在一个文件中并为我的插入处理该文件(使用 cat 或类似命令)。

更新

目前,ctac_ 建议的解决方案几乎可以正常工作。您可以在 index.html.txt, with the code snippet to insert insert.txt 和建议的命令行上测试 HTML 源代码,即:

awk '
NR==FNR{b=b[=14=]RS;next}
/<div id="jsn-body">/{a=1;s[d]++}
a && /<div/{s[d]++}
a && /<\/div/{s[d]--}
a && s[d]==1{a=0;print [=14=]RS b;next}1' insert.txt index.html.txt > outfile.html.txt

不幸的是,当我在上述 awk 命令的输出中“grep 'jsn-content-bottom”时(即通过删除重定向“> outfile.html.txt”),没有显示模式匹配。

我不知道错误可能来自哪里。

您可以在以下文件上测试ctac_给出的解决方案:

index.html.txt insert.txt

并使用上面的 awk 命令。

你可以试试这个 awk

awk '
NR==FNR{b=b[=10=]RS;next}
/<div id="jsn-page">/{a=1;d++}
a && /<div/{d++}
a && /<\/div/{d--}
a && d==1{a=0;print [=10=]RS b;next}1' insert.txt infile.html >outfile.html

insert.txt 包含块 'jsn-content-bottom">...code...'.

先读取这个文件,把这个内容保存在b.

阅读 infile.html 并找到块 jsn-page 的开始。

a 是一个标志,告诉我们在街区中。

每次看到 'div' d 都会递增(块开始)。

每次看到“<\div”时,d 都会递减(块结束)。

当dreturn为1时,jsn-page块结束

a=0 告诉我们已经出局了。

所以打印当前行和b(插入文件的内容)