如何删除文字之间的内容?

时间:2019-04-01 08:48:58

标签: html regex sed grep

我想删除所有子文件夹中所有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可以做到吗?

3 个答案:

答案 0 :(得分:2)

使用正则表达式解析HTML或XML文件基本上是没有完成的(请参见herehere)。 sedawk之类的工具在处理文本文件方面非常强大,但是当归结为解析复杂结构的数据(例如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' {} \;