查找并替换或删除 HTML在 Linux 中使用 sed 标记

查找并替换或删除 HTML在 Linux 中使用 sed 标记

我需要删除<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的所有节点:ahrefhttps://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,请xmlstarletfind这样调用:

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从上面的命令中删除运行之前,您应该查看这些文件并确定它们看起来是否正常。

显然你应该在复制测试时备份的数据。

相关内容