我想删除所有子文件夹中所有html文件中的所有<scripts>
。
我找不到该行的正确版本
正则表达式:<script[\w\W]*?</script>
出于我的原因,这是该行的外观:
find . -type f -name «*.html» -exec sed -i 's/<script[\w\W]*?</script>//g' {} \;
我还在每次放映中都尝试过:
\<script\[\\w\\W\]\*\?\<\/script\>
这不起作用
还有另一种选择
find -type f -name \*.html | xargs sed -i '/\<script/,/\<\/script\>/c\ '
,但它会从第一个脚本到最后一个脚本删除页面的所有内容。
我只需要删除<script ....</script>
也许grep可以做到吗?
答案 0 :(得分:2)
使用正则表达式解析HTML或XML文件基本上是没有完成的(请参见here和here)。 sed
和awk
之类的工具在处理文本文件方面非常强大,但是当归结为解析复杂结构的数据(例如XML,HTML,JSON等)时,它们仅是其一而已而不是大锤。是的,您可以完成工作,但有时要付出巨大的代价。为了处理这些精美的文件,您需要使用更有针对性的工具集来提高技巧。
如果解析XML或HTML,则可以轻松使用xmlstarlet
。
xmlstarlet ed -d '//script'
但是,由于HTML页面通常不是格式正确的XML,因此使用tidy
对其进行清理可能很方便。在上面的示例中,这给出了:
$ tidy -q -numeric -asxhtml --show-warnings no <file.html> \
| xmlstarlet ed -N "x=http://www.w3.org/1999/xhtml" \
-d '//script'
其中-N
给出XHTML命名空间(如果有的话),它由
<html xmlns="http://www.w3.org/1999/xhtml">
在tidy
的XHTML输出中。
答案 1 :(得分:2)
文件示例:
$ more input.html
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
</head>
<body>
<p id="example"></p>
<script>
document.getElementById("example").innerHTML = "My first JavaScript code";
</script>
</body>
</html>
样式表示例:
$ more removescript.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="//script" />
</xsl:stylesheet>
命令:
$ xsltproc --html removescript.xsl input.html
<html>
<head>
<title>Title of the document</title>
</head>
<body>
<p id="example"/>
</body>
</html>
说明:
样式表将复制每个节点和属性,当它与节点<script> </script>
匹配时将不执行任何操作(不进行复制),因此这些节点将被从结果中删除。
答案 2 :(得分:0)
我找到了简单的解决方案:
find . -type f -name "*.html" -exec perl -0 -i -pe 's/<script.*?script>//gs' {} \;