我根据another thread改编了Stack Overflow上的这个脚本。脚本可以工作,但是由于搜索查询中的特殊字符(<
,>
,"
,=
)导致脚本输出错误。
基本上,我只需要找到<script src="https://d1tdp7z6w94jbb.cloudfront.net/js/jquery-3.3.1.min.js" type="text/javascript" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
并将其删除。
setlocal EnableExtensions DisableDelayedExpansion
set "search=<script src="https://d1tdp7z6w94jbb.cloudfront.net/js/jquery-3.3.1.min.js" type="text/javascript" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>"
set "replace="
set "textFile=index.html"
set "rootDir=."
for %%j in ("%rootDir%\%textFile%") do (
for /f "delims=" %%i in ('type "%%~j" ^& break ^> "%%~j"') do (
set "line=%%i"
setlocal EnableDelayedExpansion
set "line=!line:%search%=%replace%!"
>>"%%~j" echo(!line!
endlocal
)
)
endlocal
我在Stack Overflow上发现了其他线程在问同样的问题,但我不了解它们的实现以及如何将其应用于此脚本。
答案 0 :(得分:0)
Windows命令处理器cmd.exe
设计用于执行命令和应用程序。它不是为与文件类型无关的文件内容修改而设计的。
很多脚本解释器都内置了对文件内容修改的支持,例如VBScript,JScript,PowerShell,Perl,Python等。因此,最好为此使用与Windows命令处理器不同的脚本解释器。任务,特别是在搜索或替换字符串中包含"<=>|
的问题,这使得使用纯Windows命令处理器命令修改文件内容成为噩梦。
但是,使用 Dave Benham 编写的JREPL.BAT可以轻松完成任务,这是一个批处理文件/ JScript混合程序,可以使用JScript在文件上运行正则表达式替换。
@echo off
if not exist ".\index.html" goto :EOF
if not exist "%~dp0jrepl.bat" goto :EOF
call "%~dp0jrepl.bat" "[\t ]*<script src=\x22https://d1tdp7z6w94jbb.cloudfront.net/js/jquery-3.3.1.min.js\x22 type=\x22text/javascript\x22 integrity=\x22sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=\x22 crossorigin=\x22anonymous\x22></script>[\t ]*\r?\n?" "" /M /F ".\index.html" /O -
批处理文件首先检查当前目录中是否存在index.html
文件,如果此条件不成立,则立即退出,请参见Where does GOTO :EOF return to?
批处理文件 JREPL.BAT 必须与具有上述代码的批处理文件存储在同一目录中。因此,该批处理文件将检查 JREPL.BAT 是否确实存在于该批处理文件的目录中,如果此条件不成立,则退出。
接下来,批处理文件调用 JREPL.BAT 以区分大小写的正则表达式替换,替换字符串为空字符串。
搜索字符串主要是应从文件中删除的字符串。
搜索字符串中的每个"
被\x22
代替,22
是用于搜索具有十六进制代码值"
的字符的表达式,十六进制代码值是字符%
的代码值即可在Windows命令行上将此字符串指定为用双引号引起来的一个参数字符串。
主搜索字符串不包含任何具有特殊正则表达式含义的字符,因此,JScript的正则表达式函数不能将其他字符加上反斜杠转义为原义字符。
主搜索字符串也不包含任何带有特殊Windows命令处理器的字符,即使在双引号参数字符串(例如百分号%
之内)中也是如此。搜索的字符串中的每个%
都需要与另外一个cmd.exe
一起转义,以便通过[\t ]*
解析此命令行,然后再调用已解析的另一个批处理文件来解释为文字字符争论。
搜索表达式以[\t ]*\r?\n?
开头,另外删除了要删除的0个或多个水平制表符或字符串的常规空格。通常,要删除的字符串在HTML文件中的单独行中,该行上带有制表符或空格的缩进,并且目标是也删除那些缩进的空格。
搜索表达式以/M
结尾,另外删除了要删除的字符串右边的0个或多个水平制表符或普通空格,即行上的尾部空格,以及如果存在的话,则返回一个回车符,以及一行-feed(如果有的话)。
因此,如果要删除的字符串位于HTML文件中的单独行上,则不带或不带前导制表符/空格,不带或带有尾部制表符/空格,因此将从文件中删除整行。但是,如果要删除的字符串与其他HTML标记在一行上,则只会从HTML文件中删除搜索到的字符串以及该字符串左右的制表符/空格。 JREPL.BAT 选项call /?
用于删除整行,不仅删除该行中的搜索字符串,还删除脚本标记上的空行(位于单独的行中)
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
%~dp0
...也解释了echo /?
...参数0的驱动器和路径是批处理文件本身。goto /?
if /?
jrepl.bat /?
sudo bash