如何在字符串搜索/替换中处理特殊字符(<,>,“,=”)

时间:2019-07-02 23:55:33

标签: batch-file replace cmd special-characters

我根据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上发现了其他线程在问同样的问题,但我不了解它们的实现以及如何将其应用于此脚本。

1 个答案:

答案 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