我正在寻找一种在块<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_
给出的解决方案:
并使用上面的awk
命令。
由于
答案 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(插入文件的内容)