bash sed-如何从html文件中删除所有脚本标签

时间:2018-09-28 16:26:33

标签: bash sed

如何使用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>                                                                               

6 个答案:

答案 0 :(得分:5)

sed is the wrong tool for this:

  

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

看看pupxsltproc来处理外壳上的所有HTML。

答案 1 :(得分:3)

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

使用:

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

第一行(s/<script>.*<\/script>//g)将在一行中为他们工作;

第二部分(/<script>/,/<\/script>/{/<script>/!{/<\/script>/!d}})几乎是@akingokay答案的引号,只是我排除了出现的行(以防万一它们之前或之后有东西)。 Using sed to delete all lines between two matching patterns中对此有很好的解释;

最后两个(s/<script>.*//gs/.*<\/script>//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是正确的,这不是正确的工具。

答案 2 :(得分:1)

由于 l0b0 已经mentioned,使用sed处理HTML是一个坏主意。
除了pupxlstproc之外,还有另一个名为xidel的工具。

$ xidel -s test1.html -e '//body/transform(/,function($x){$x/(if (name()="script") then () else .)})' --output-format=html

另请参阅this online xidelcgi demo

答案 3 :(得分:0)

您可以在线测试这些实用程序,例如在http://rextester.com/l/bash_online_compiler上。

echo 'abc <script> def </script> xyz' | sed "/<script/,/<\/script>/d"

输出为= abc和xyz

答案 4 :(得分:0)

这将起作用:

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

此表达式在文本内搜索<script></script>子字符串,并将其替换为空白,因此将其删除:)

答案 5 :(得分:0)

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

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