我的脚本
/<script/{
: START;
s#</script>#&#;
t DEL;
: LOOP;
N;
s#</script>#&#;
t DEL;
b LOOP;
: DEL;
s#<script.*</script>##;
s#<script#&#;
t START;
}
将上述代码保存到deljs.sed
文件中,使用以下命令调用:
sed -f deljs.sed demo.html
另外,如果不想使用sed
脚本文件的形式,也可以将sed
脚本中的代码写成一行,方便放到shell中,使用下述命令:
sed '/<script/{: START;s#</script>#&#;t DEL;: LOOP;N;s#</script>#&#; t DEL;b LOOP;: DEL;s#<script.*</script>##;s#<script#&#;t START;}' demo.html
脚本详解
参考自sed
命令的man
文档
/<script/{
对字符串"<script"进行寻址,找到后执行一个命令块。
{
:开始一个命令块(以}
结尾)。: START;
设置一个名为"START"的标签。
: label
:用于b
或t
或T
命令的标签。s#</script>#&#;
执行替换命令,将字符串"</script>“替换为”</script>"。
s/regexp/replacement/
:使用正则表达式regexp
与模式空间进行匹配,如果匹配成功,替换为匹配的部分为replacement
,replacement
可能包含特殊字符&
来代指模式空间中与之匹配的部分,或者转义字符\1
到\9
来代指正则表达式regexp
中对应的匹配子表达式。t DEL;
如果上述替换命令执行成功,跳转到名为"DEL"的标签处。
t label
:如果自从读入当前行,并且自上一条t
或T
命令到现在,有一条s///
替换命令执行成功,就跳转到指定的标签处,如果不指定标签,则跳转到脚本结束。
T label
:与t label
相反,如果没有s///
替换命令执行成功,则跳转到指定的标签处。: LOOP;
设置一个名为"LOOP"的标签。
N;
将下一行加入模式空间。
n N
:读取/追加下一行输入,到模式空间。s#</script>#&#;
执行替换命令,将字符串"</script>“替换为”</script>"。
t DEL;
如果上述替换命令执行成功,跳转到名为"DEL"的标签处。
b LOOP;
跳转到名为"LOOP"的标签处。
b label
:跳转到指定标签处,如果未指定标签,则跳转到脚本结束。: DEL;
设置一个名为"DEL"的标签。
s#<script.*</script>##;
执行替换命令,将正则表达式"<script.*</script>"匹配到的模式空间中的内容替换为空。
s#<script#&#;
执行替换命令,将字符串"<script"替换为"<script"。
用于防止上一个标签对的</script>与下一个标签对的<script>在同一行的情况。t START;
如果上述替换命令执行成功,跳转到名为"START"的标签处。
}
结束一个命令块。
注意事项
-
上述方法只是删除了html中的所有<script>标签,并没有删除html中所有的js,因为js还可以直接内嵌到html的其他标签中,比如,引用自NotFoundObject大佬的一篇博客《js在HTML中的三种写法》原文链接:
<!--当鼠标点击图片时跳出弹窗显示1223--> <div class="img"> 单击事件: <img src="images/001.jpg" onclick="alert(1223)"></img> </div>
-
如果html正文中存在<script>标签,同样会被删除。