如何使用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>
答案 0 :(得分:5)
sed
is the wrong tool for this:
请勿尝试使用sed,awk,grep等(这会导致不良结果)。在许多情况下,最好的选择是使用支持XML数据的语言编写。如果必须使用Shell脚本,则可以使用一些特定于HTML和XML的工具来为您解析这些文件。
答案 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>.*//g
和s/.*<\/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是一个坏主意。
除了pup
和xlstproc
之外,还有另一个名为xidel
的工具。
$ xidel -s test1.html -e '//body/transform(/,function($x){$x/(if (name()="script") then () else .)})' --output-format=html
答案 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'