【问题标题】:How to deal with special characters (<, >, ", =) in string search/replace [duplicate]如何处理字符串搜索/替换中的特殊字符(<,>,“,=)[重复]
【发布时间】:2019-07-02 23:55:33
【问题描述】:

我从 Stack Overflow 上的 another thread 改编了这个脚本。脚本有效,但由于搜索查询中的特殊字符(&lt;&gt;"=)导致输出不正确。

基本上,我只需要找到&lt;script src="https://d1tdp7z6w94jbb.cloudfront.net/js/jquery-3.3.1.min.js" type="text/javascript" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"&gt;&lt;/script&gt; 并将其删除即可。

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

【问题讨论】:

  • 我的测试表明 &lt;&gt; 是破坏性的东西,而不是引号。你得到的确切错误是什么?
  • 这个任务真的有必要使用批处理吗?还有很多其他工具可以更快更好地完成它。
  • 感谢@SomethingDark,非常感谢您让我知道。问题是搜索条件显示在输出文件中。我认为这是因为“但谢谢你的澄清。
  • @montonero,它是为了易于使用(运行脚本不需要主机)和未来可配置性,无需重新编码。另外,我不是编码员,但对 .BAT 很熟悉,因为您必须从 3.5" 加载 MS-DOS。:)

标签: batch-file replace cmd special-characters


【解决方案1】:

Windows 命令处理器cmd.exe 专为执行命令和应用程序而设计。它不是为独立于文件类型的文件内容修改而设计的。

有很多脚本解释器内置支持修改文件内容,如 VBScript、JScript、PowerShell、Perl、Python 等,因此最好使用与 Windows 命令处理器不同的脚本解释器任务,尤其是在搜索或替换字符串时包含 "&lt;=&gt;|,这使得使用纯 Windows 命令处理器命令修改文件内容成为一场噩梦。

但是,使用 Dave Benham 编写的JREPL.BAT 是一个很容易实现的任务,它是一个批处理文件/JScript 混合体,可以使用 JScript 对文件运行正则表达式替换。 p>

@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 ]* 开头,以另外删除0 个或多个水平制表符或留给要删除的字符串的普通空格。要删除的字符串通常在 HTML 文件中的单独行中,以制表符或空格缩进,目标也是删除那些缩进的空格。

搜索表达式以[\t ]*\r?\n? 结尾,以删除要删除的字符串右侧的 0 个或多个水平制表符或普通空格,即行尾的空格,如果存在则一个回车符和一个换行符如果存在的话。

因此,如果要删除的字符串在 HTML 文件中的单独行上,不带或带前导制表符/空格,且不带或带尾随制表符/空格,则从文件中删除整行。但是,如果要删除的字符串与其他 HTML 标记位于同一行,则仅从 HTML 文件中删除搜索到的字符串以及该字符串左右两侧的制表符/空格。 JREPL.BAT 选项/M 用于能够删除整行,而不仅仅是行内的搜索字符串,并在单独的行上的脚本标记上留下空行。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /? ... 还解释了 %~dp0 ... 参数 0 的驱动器和路径是批处理文件本身。
  • echo /?
  • goto /?
  • if /?
  • jrepl.bat /?

【讨论】:

  • 哇@Mofi,这真是太棒了。 [\t]* 部分特别聪明,很棒的想法! JREPL.BAT 看起来很棒。 (您是否看到帮助页面超过文件大小的一半?!XD 我看不到任何用于递归子目录的开关。/s 是一些命令行程序的标准,但似乎没有JREPL。对此有什么想法吗?我还有一些其他字符串需要查找和替换,因此需要递归。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 2011-04-16
  • 2011-05-16
  • 2016-09-21
  • 2019-09-03
相关资源
最近更新 更多