工具类似于在<div id =“jsn-page”> ... </div>

时间:2017-10-22 01:23:39

标签: html shell sed insertion

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

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

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

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

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

UPDATE1:

目前,ctac_建议的解决方案几乎正常。您可以在index.html.txt上测试HTML源代码,并使用代码段插入insert.txt和建议的命令行,即:

awk '
NR==FNR{b=b$0RS;next}
/<div id="jsn-body">/{a=1;s[d]++}
a && /<div/{s[d]++}
a && /<\/div/{s[d]--}
a && s[d]==1{a=0;print $0RS 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命令。

由于

1 个答案:

答案 0 :(得分:0)

你可以试试这个awk

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

insert.txt包含块'jsn-content-bottom'&gt; ... code ...'。

首先阅读此文件并将此内容保存在b。

读完infile.html后找到块jsn-page的开头。

a是告诉我们在街区的旗帜。

每次看到“div”时d都会递增(块的开始)。

每次看到'&lt; \ div'时d减少(块结束)。

当d返回1时,它是块jsn-page的结尾。

a = 0告诉我们已经不在了。

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