我需要删除<li>
许多index.html 页面中的以下html 标记。
<li>
<a href="https://forward.global.ssl.fastly.net/contributoragreements/" onclick="_gaq.push(['_trackEvent', 'ClickTracking', 'TopNav_Contact_Editorial', window.location.href]);">Editorial</a>
</li>
我需要在许多文件中递归地删除它。所以我想在linux的sed中使用正则表达式是最好的选择。我尝试了很多方法但找不到解决方案。 index.html 文件中还有其他<li>
标签,但无论如何都不应该编辑它们。仅应删除上述标签。
提前谢谢了。
答案1
假设文档片段是格式良好的 XHTML 文件的一部分,您可以删除包含其属性值恰好为using 的节点li
的所有节点:a
href
https://forward.global.ssl.fastly.net/contributoragreements/
xmlstarlet
xmlstarlet ed --delete '//li[a/@href = "https://forward.global.ssl.fastly.net/contributoragreements/"]' file.xhtml
如果文档不是格式良好的 XHTML 文档,您可以先尝试恢复它:
xmlstarlet fo --recover --html file.html |
xmlstarlet ed --delete '//li[a/@href = "https://forward.global.ssl.fastly.net/contributoragreements/"]'
index.html
要对rotted 目录结构中的所有文件运行此命令top-dir
,请xmlstarlet
像find
这样调用:
find top-dir -type f -name index.html -exec sh -c '
tmpfile=$(mktemp)
for pathname do
cp "$pathname" "$tmpfile"
xmlstarlet fo --recover --html "$tmpfile" |
xmlstarlet ed --delete "//li[a/@href = \"https://forward.global.ssl.fastly.net/contributoragreements/\"]" >"$pathname.new"
done
rm -f "$tmpfile"' sh {} +
上面的代码将为index.html.new
每个找到的index.html
文件创建一个新文件。在.new
从上面的命令中删除运行之前,您应该查看这些文件并确定它们看起来是否正常。
显然你应该在复制测试时备份的数据。