【问题标题】:How to remove all script tags from html file如何从html文件中删除所有脚本标签
【发布时间】:2019-03-04 16:32:44
【问题描述】:

如何使用 sed 删除 html 文件中的所有脚本标签?

我尝试了这个但不起作用,下面的命令不会从test1.html中删除任何脚本标签。

$ sed -e 's/<script[.]+<\/script>//g' test1.html > test1_output.html

我的目标是从 test1.html 到 test1_output.html

test1.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>My Website</h1>

        <div class="row">
            some text
        </div>

        <script  type="text/javascript"> utmx( 'url', 'A/B' );</script>

        <script src="ga_exp.js" type="text/javascript" charset="utf-8"></script>    
        <script type="text/javascript">
            window.exp_version = 'control';
        </script>        
    </body>
</html>

test1_output.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>My Website</h1>

        <div class="row">
            some text
        </div>

    </body>
</html>

【问题讨论】:

  • “不起作用”。你应该与大家分享它是如何不起作用的。结果或错误是什么?此外,可能相关,如果不是重复的话:stackoverflow.com/q/19878056/1531971(那里的信息也可以扩展到这种情况。)
  • @jdv 命令“不起作用”原因什么也没做(我不知道为什么),出现任何错误。
  • 但是我们怎么会知道呢? “不起作用”可能是错误的结果,零结果,紫色的猴子从你的 USB 端口飞出,谁知道呢?我们的想法是告诉我们您想做什么,展示您的尝试并分享结果。
  • tks @jdv 谢谢,希望问题现在写得更好
  • 我永远不会放弃分享这个的机会:stackoverflow.com/a/1732454/1531971

标签: html bash sed


【解决方案1】:

如果我正确理解了您的问题,并且您想删除 &lt;script&gt;&lt;/script&gt; 中的所有内容,我认为您必须将 sed 分成几部分(您可以使用 ; 单行):

使用:

sed 's/<script>.*<\/script>//g;/<script>/,/<\/script>/{/<script>/!{/<\/script>/!d}};s/<script>.*//g;s/.*<\/script>//g'

第一段 (s/&lt;script&gt;.*&lt;\/script&gt;//g) 在一行中对他们有效;

第二部分 (/&lt;script&gt;/,/&lt;\/script&gt;/{/&lt;script&gt;/!{/&lt;\/script&gt;/!d}}) 几乎是对@akingokay 答案的引用,只是我排除了出现的行(以防他们在之前或之后有一些东西)。很好的解释在这里Using sed to delete all lines between two matching patterns;

最后两个(s/&lt;script&gt;.*//gs/.*&lt;\/script&gt;//g)最终处理了开始和不结束或不开始和结束的行。

现在,如果您有一个 index.html,其中包含:

<html>
  <body>
        foo
        <script> console.log("bar) </script>
  <div id="something"></div>
        <script>
                // Multiple Lines script
                // Blah blah
        </script>
        foo <script> //Some
        console.log("script")</script> bar
  </body>
</html>

然后你运行这个 sed 命令,你会得到:

cat index.html | sed 's/<script>.*<\/script>//g;/<script>/,/<\/script>/{/<script>/!{/<\/script>/!d}};s/<script>.*//g;s/.*<\/script>//g'
<html>
  <body>
    foo


        <div id="something"></div>




    foo 
 bar
  </body>

</html>

最后你会有很多空格,但代码应该能按预期工作。当然,您也可以使用 sed 轻松删除它们。

希望对你有帮助。

PS:我认为@l0b0 是对的,但这不是正确的工具。

【讨论】:

  • works tks ...如果脚本标签具有属性,则必须删除尖括号的关闭,对吗? $ 猫 test1.html | sed 's///g;/
  • 没错,我没有考虑过这种情况,但就是这么简单。问候
【解决方案2】:

sed is the wrong tool for this:

不要尝试使用 sed、awk、grep 等(这会导致不希望的结果)。在许多情况下,最好的选择是使用支持 XML 数据的语言编写。如果您必须使用 shell 脚本,可以使用一些特定于 HTML 和 XML 的工具来为您解析这些文件。

查看pupxsltproc 以处理shell 上的任何HTML。

【讨论】:

  • 如果 pup 是正确的工具。你能用 pup 回答这个问题吗?
  • 不,因为我对此了解不够。
  • 我同意 sed 不是最好的工具……但是在阅读了pup 的 github 页面以供使用之后,它似乎更专注于 选择 元素。没有看到为 removing 元素列出的任何内容或运行时--help。可能是一些用例,其中选择特定元素就足够了,但还有其他需要/需要实际删除的用例......无论如何,我已经可以使用xmllint --html --xpath &lt;xpath&gt; 进行一些选择。不幸的是,pup 确实 not 似乎是 jqxmlstarlet 的 html 等价物。很高兴被证明是错误的,但我不这么认为。
  • ^ 我认为部分问题在于 html 更难编写工具:有 html marlup、css、js/json、CDATA 块等来处理解析,有多个差异标准(如旧 html、htlm4、xhtml 等)来处理验证,说实话:大多数网站甚至根本不尝试编写验证代码。即使有人写了一些东西,只是将 html 标签作为 xml 处理,而不会阻塞内联 CDATA、javascript 和 css 并且可能只是将它们视为文本元素......这将是一项艰巨的任务。
  • ^ 一些我想到但尚未探索的其他选项:使用 firefox + selenium 脚本加载本地文件进行修改并保存,提到的选项之一here(可能是其中之一these?),或者选择带有xmllint 的部分,然后从头开始重建整个东西......更糟糕的情况,如果没有好的工具,我认为perl -0777 -pe &lt;regex&gt; &lt;file&gt; 至少会稍微 i> 由于多行匹配和更灵活的正则表达式,优于 sed
【解决方案3】:

由于 l0b0 已经 mentioned,因此使用 sed 处理 HTML 是个坏主意。
除了pupxlstproc还有一个工具,叫,你可以看看。

$ xidel -s test1.html -e 'x:replace-nodes(//body/script,())' --output-format=html

另见this online xidelcgi demo

【讨论】:

    【解决方案4】:

    这将起作用:

    sed 's/<script>//;s/<\/script>//' test1.html
    

    此表达式在文本中搜索&lt;script&gt;&lt;/script&gt; 子字符串并将它们替换为空,因此将其删除:)

    【讨论】:

    • s/// 什么都不做,有什么意义呢?与您的解释有关,如果脚本标签具有属性怎么办???
    • @oguzismail 不,s/// 做了一些事情:它用任何内容替换与前一个正则表达式匹配的缓冲区内容。由于没有以前的正则表达式,这是一个错误。原来的内容是s/&lt;script&gt;//,因为没有正确引用而被删除。
    • @xhienne 不知道,谢谢。答案仍然是错误的
    • @oguzismail 其实并没有错,我以为 Simone 只想删除标签而不是其中的属性。
    【解决方案5】:

    您可以在线测试此类实用程序,例如在 http://rextester.com/l/bash_online_compiler

    echo 'abc &lt;script&gt; def &lt;/script&gt; xyz' | sed "/&lt;script/,/&lt;\/script&gt;/d"

    输出为 = abc 和 xyz

    【讨论】:

    • 只有在 &lt;script&gt;&lt;/script&gt; 位于不同的行时才能正常工作,这与您的示例输入不同;它还假设这些线上没有其他内容。您的示例的输出实际上是空字符串。
    【解决方案6】:

    我发现@JorgeValenti 的答案无法识别具有 src 属性的脚本标签。这个版本的咒语解决了这个问题:

    sed -i 's/<script.*<\/script>//g;/<script/,/<\/script>/{/<script/!{/<\/script>/!d}};s/<script.*//g;s/.*<\/script>//g'
    

    【讨论】:

      猜你喜欢
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2015-12-13
      • 1970-01-01
      • 2011-07-10
      • 2017-02-27
      • 2014-09-27
      相关资源
      最近更新 更多