如何搜索并替换内部包含等号“=”的字符串

2023-12-07

我必须从像 Pippo.K=5 这样的 txt 中搜索字符串并将其替换为 Pippo.K=1。我需要搜索整个字符串。我所做的是:

set "search=Pippo.K=5"
set "replace=Pippo.K=1"
set "textFile=%SettingFile%.txt"
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    >>"%textFile%" echo(!line!
    endlocal
)

但我返回的是5=Pippo.K=1=5

我该如何修复这个错误?


下面的脚本构成了一个纯粹的批处理文件解决方案。假设它存储为repl-str.bat,您需要为您的应用程序这样调用它:

repl-str.bat "%SettingFile%.txt" "Pippo.K=5" "Pippo.K=1" "%SettingFile%.txt"

这指定输入文件%SettingFile%.txt,文字且区分大小写的搜索字符串Pippo.K=5, 替换字符串Pippo.K=1和输出文件%SettingFile%.txt与输入文件相同(相关技术取自此答案:用于查找和替换文本文件中的字符串的批处理脚本,无需创建额外的输出文件来存储修改后的文件)。如果没有给出输出文件,结果将输出到控制台(对于测试有用)。如果给出第五个命令行参数(任意值),则搜索将以区分大小写的方式完成。

这是脚本的代码repl-str.bat:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "FILE_I=%~1"
set "SEARCH=%~2"
set "REPLAC=%~3"
set "FILE_O=%~4"
set "CASE=%~5"
set "FLAG=%~6"
if not defined FILE_I exit /B 1
if not defined SEARCH exit /B 1
if not defined FILE_O set "FILE_O=con"
if defined CASE set "CASE=#"
if defined FLAG set "FLAG=#"

for /F "delims=" %%L in ('
    findstr /N /R "^" "%FILE_I%" ^& break ^> "%FILE_O%"
') do (
    set "STRING=%%L"
    setlocal EnableDelayedExpansion
    set "STRING=!STRING:*:=!"
    call :REPL RETURN STRING SEARCH REPLAC "%CASE%" "%FLAG%"
    >> "%FILE_O%" echo(!RETURN!
    endlocal
)

endlocal
exit /B


:REPL  rtn_string  ref_string  ref_search  ref_replac  case  flag
setlocal EnableDelayedExpansion
set "STR=!%~2!"
set "SCH=!%~3!"
set "RPL=!%~4!"
if "%~5"=="" (set "OPT=/I") else (set "OPT=")
if not defined SCH endlocal & set "%~1=" & exit /B 1
set "SCH_CHR=!SCH:~,1!"
if not "%~6"=="" set "SCH_CHR="
if "!SCH_CHR!"=="=" set "SCH_CHR=" & rem = terminates search string
if "!SCH_CHR!"==""^" set "SCH_CHR=" & rem " could derange syntax
if "!SCH_CHR!"=="%%" set "SCH_CHR=" & rem % ends variable expansion
if "!SCH_CHR!"=="^!" set "SCH_CHR=" & rem ! ends variable expansion
call :LEN SCH_LEN SCH
call :LEN RPL_LEN RPL
set /A RED_LEN=SCH_LEN-1
set "RES="
:LOOP
call :LEN STR_LEN STR
if not defined STR goto :END
if defined SCH_CHR (
    set "WRK=!STR:*%SCH_CHR%=!"
    if %OPT% "!WRK!"=="!STR!" (
        set "RES=!RES!!STR!"
        set "STR="
    ) else (
        call :LEN WRK_LEN WRK
        set /A DFF_LEN=STR_LEN-WRK_LEN-1,INC_LEN=DFF_LEN+1,MOR_LEN=DFF_LEN+SCH_LEN
        for /F "tokens=1,2,3 delims=," %%M in ("!DFF_LEN!,!INC_LEN!,!MOR_LEN!") do (
            rem set "RES=!RES!!STR:~,%%M!"
            if defined WRK set "WRK=!WRK:~,%RED_LEN%!"
            if %OPT% "!STR:~%%M,1!!WRK!"=="!SCH!" (
                set "RES=!RES!!STR:~,%%M!!RPL!"
                set "STR=!STR:~%%O!"
            ) else (
                set "RES=!RES!!STR:~,%%N!"
                set "STR=!STR:~%%N!"
            )
        )
    )
) else (
    if %OPT% "!STR:~,%SCH_LEN%!"=="!SCH!" (
        set "RES=!RES!!RPL!"
        set "STR=!STR:~%SCH_LEN%!"
    ) else (
        set "RES=!RES!!STR:~,1!"
        set "STR=!STR:~1!"
    )
)
goto :LOOP
:END
if defined RES (
    for /F delims^=^ eol^= %%S in ("!RES!") do (
        endlocal
        set "%~1=%%S"
    )
) else endlocal & set "%~1="
exit /B


:LEN  rtn_length  ref_string
setlocal EnableDelayedExpansion
set "STR=!%~2!"
if not defined STR (set /A LEN=0) else (set /A LEN=1)
for %%L in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
    if defined STR (
        set "INT=!STR:~%%L!"
        if not "!INT!"=="" set /A LEN+=%%L & set "STR=!INT!"
    )
)
endlocal & set "%~1=%LEN%"
exit /B

基本上,这种方法采用搜索字符串的第一个字符并在输入文本中查找它。在每次匹配时,都会检查整个搜索字符串是否出现。如果是这样,则通过删除与搜索字符串包含的字符一样多的字符来替换它,从而避免子字符串替换语法在搜索字符串包含时失败=,或者搜索或替换字符串包含% or !.
但是,如果搜索字符串的第一个字符是=, ", % or !,方法不同,脚本检查每个字符位置是否出现搜索字符串,缺点是降低了整体性能。如果给出了第六个命令行参数(任意值),则强制使用此(慢速)模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何搜索并替换内部包含等号“=”的字符串 的相关文章

  • PHP 检查字符串是否只包含任何语言的字母、数字和空格

    我如何检查字符串是否只包含任何语言中的字母 数字和空格 我已经尝试过 但它不检查像 这样的特殊字符 preg match p L u string preg match p N u string 您可以使用 preg match p L p
  • 正则表达式接受 4 条规则中的 3 条

    我似乎无法让正则表达式正确满足以下要求 长度在 8 到 20 之间的字符串 必须包含至少 1 个大写字母字符 至少 1 个小写字母字符 以及至少 1 个数字或至少 1 个特殊字符字符 或两者 假设特殊字符仅限于包括 我最初是这样写的 A Z
  • 使用 .bat 通过文件资源管理器打开文件夹

    我应该使用什么命令在程序末尾打开指定路径 start c Yaya yoyo 不管用 你可以这样尝试 SystemRoot explorer exe c Yaya yoyo
  • 如何从Windows阻止社交媒体[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想根据时间阻止我的电脑上的社交媒体 晚上 9 点后屏蔽 上午 11 点后解锁 如家长控制 我尝试过关注但失败了 创建了
  • 获取给定卷的驱动器号?

    给定硬盘卷名 如何在 Windows 7 中使用批处理文件获取驱动器号 Using 电源外壳 questions tagged powershell Get WMIObject Win32 logicaldisk where volumen
  • C# 控制台应用程序 - cmd.exe 挂起

    我在 Visual Studio 2013 中运行简单的 C 控制台应用程序时遇到问题 我的问题的详细信息 我成功运行控制台应用程序 默认的 按任意键继续 显示在最后 突然 它开始表现出不同的行为 并出现以下症状 一个新的命令窗口 cmd
  • 批处理脚本 - 逐行读取

    我有一个日志文件 我需要逐行读入并将该行传送到下一个循环 首先 我在一个单独的文件中 grep 日志文件中的 主 字 如 错误 以保持其较小 现在我需要获取单独的文件并逐行读取它 每行都需要进入另一个循环 在这些循环中我 grep 日志并将
  • 线性空白到底是什么? (LWS/LWSP)

    我看到提到了这个术语 还有 CRLF CR LF CTL 控制字符 和 SP 空格 如果它不是常规的内联空格 那么它是什么字符 From STD68 语法规范的增强 BNF ABNF http www rfc editor org std
  • 使用管理员权限打开cmd(Windows 10)

    我有自己的 python 脚本来管理我的计算机上的 IP 地址 它主要在命令行 Windows 10 中执行netsh命令 您必须具有管理员权限 这是我自己的计算机 我是管理员 运行脚本时我已经使用管理员类型的用户 Adrian 登录 我无
  • 为什么 Windows 命令 DIR 在搜索 *.tif 文件时也会输出 *.tiff 文件?

    我想使用 Windows 命令DIR为了找到唯一TIF文件 即具有扩展名的文件 tif 因此我使用以下小批处理文件 for f delims a IN dir b a d s C wolter testversion input tif d
  • 通过批处理文件自动化 cygwin

    长话短说 我们有多个服务器 我们每晚都在其上运行 perflog 监控 我的工作是将这些日志转换为 csv 格式并将它们发送到我的电子邮件 这一点已经通过前员工编写的 sh 脚本实现了自动化 我想要自动化的是在 perfmon 日志记录之后
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • 替换 prolog 中的部分表达式

    我需要简化序言中的身份 例如x 0 x x x 0 ETC 为此 我需要替换表达式的部分内容 比如x 0 by x 您能帮我更换吗 Prolog 的一个巧妙之处在于您可以非常轻松地解构算术表达式 您的基本模板将如下所示 simplify X
  • 从 vbscript 获取 bat 中的错误级别

    我试图确定用户是否在 UAC 提示中单击 否 如果是 则不设置空端口 我将此脚本称为批处理文件 如果用户单击 否 我想退出该脚本 VB 脚本 选项显式 Main Sub Main Dim oShell objWMIService servS
  • 在 Visual Studio Code 终端中打开 CMD

    每当我在 Visual Studio Code 中打开终端时 我都会得到一个 bash shell 我想添加 CMD 作为第二个 shell 为此 我浏览了 VS Code 文档并找到了以下命令 CTRL SHIFT 但它只打开第二个 ba
  • 如何在批处理文件中重复%random%命令?

    我想在有限的时间内重复批处理文件中的命令 此命令 echo random random random random random random random random random random 不是无限的 只为前任40次具有不同的数字
  • 替换VBA中的变量字符串

    我需要替换字符串中的某些内容 但替换的内容可能会有所不同 有可能 XY test XXxY test XXyyXx TEST yXyy Test 以及几乎任何其他空格和上述情况的组合 我需要替换 test 部分并保留 XXX 所以 当使用简
  • 创建一个批处理文件来打开 Firefox,然后运行一个宏(等待它完成),然后运行另一个宏

    我在尝试着 1 加载火狐浏览器 2 运行 Iopus Imacro iim 等待完成 然后 3 运行下一个宏 到目前为止 我已经尝试过 start wait call 以及我在互联网上可以找到的许多其他建议 这就是我到目前为止所拥有的 运行
  • 如何删除批处理文件中的新行?

    我正在处理批处理文件并导出到文本文件 看起来一切都很好 但是当我打开文本文件时 许多新行中断 所以 我想删除它们 echo OFF setlocal EnableDelayedExpansion systeminfo findstr c H
  • 替换为 NA

    我有一个包含条目的数据框 看来这些值没有被视为 NA 因为 is na 返回 FALSE 我想将这些值转换为 NA 但找不到方法 Use dfr dfr

随机推荐

  • 使用 Node.js (express)、Angular 和 MongoDB 的 PUT 请求出现问题

    我一直在尝试弄清楚如何将数据更新到 MongoDB 我将 Monk 与 MongoDB Node Express 和 Angular 一起使用 我对 POST 和 DELETE 没有任何问题 但无法弄清楚 PUT 出了什么问题 我得到的错误
  • 将 c 函数作为参数传递给 cython 中的 python 函数

    我有以下有效的代码 cython cdef int add int a int b return a b cdef int mult int a int b return a b ctypedef int function type int
  • 立即按行长度和字母顺序对字符串数组进行排序

    我见过用其他几种语言提出这个问题 每种语言都有很好的答案 IE 如何按行长度对文件进行排序 然后按字母顺序对第二个键进行排序 如何按字符串长度按字母顺序排序 按字母顺序和长度对字符串进行排序 我无法在 Golang 中弄清楚 假设我有这个清
  • ExtJS4 如何从 JSON 设置 TreePanels 根节点

    我想使用 ExtJS4 创建 TreePanel 所以我将 JSON 发送到代理阅读器 其格式如下 text en children text children text page children text page new childr
  • Google Sheet QUERY + MATCHES 函数不排除字符串

    我想从排除某些字符的工作表中导入行 我首先使用 CONTAINS 函数执行此操作 但我没有找到使用多个参数执行此操作的方法 所以我使用 MATCHES 函数做到了 Query importrange URL Sheet a be SELEC
  • Visual Studio Code 缺少脏文件指示器和突出显示选项卡不起作用

    当 VS Code 中有脏文件时 我没有在文件选项卡中看到项目符号 也没有在选项卡上方看到突出显示栏 我在设置中打开了突出显示修改的选项卡 但没有任何效果 我还尝试更改主题 以防出现颜色问题 我没有任何会干扰这些设置的扩展 有人经历过这个吗
  • 以对象引用作为键的映射?

    我有一个存储有关特定实例的信息的对象 为此 我想使用Map 但由于键不是通过引用的 它们不是 对吧 而是作为由getHashCode方法 为了更好地理解 import collection mutable import java util
  • Function.call 方法作为回调[重复]

    这个问题在这里已经有答案了 如果我遗漏了什么 请原谅 但是当我尝试使用 call 方法作为回调时 它在 Chrome 和 Node js 中都会出现奇怪的错误 foo bar map String prototype trim call T
  • Rust 中的多种返回类型[重复]

    这个问题在这里已经有答案了 我有一个库函数f1 in rust返回一个字符串并想要更新它以选择性地返回一个向量 fn f1 gt String abc fn f2 gt String Vec
  • Hadoop kerberos 票证自动续订

    我在使用以下命令从 HDFS 下载大文件夹时遇到一些问题 hadoop fs get path to hdfs big folder 该文件夹很大 几乎 3TB kerberos 票证的生命周期为 10 小时 可续订生命周期为 7 天 下载
  • 如何将文件下载到 PHP 服务器?

    是否可以使用 PHP 脚本将远程服务器上的文件下载到我的 Web 服务器上 我有自己的网络服务器和域 我想在该域上放置一个 php 脚本 它将文件从远程服务器下载到我的服务器的文件系统上 这可能吗 Jim 当然 您需要文件系统上某处 您要保
  • 无法将图片从drawable发布到facebook

    我正在尝试将图像从可绘制文件夹传递到提要对话框 但我无法在 Facebook feed 对话中查看图像 其余参数可用 我正在使用 Facebook SDK 3 5 这是显示提要对话框的功能 private void publishFeedD
  • C++ - Qt - Visual Studio 2010 - 具有 GUI 和控制台的应用程序

    如果没有给程序提供任何参数 它将作为 GUI 应用程序启动 如果给定参数 它将通过命令行运行 我能够使用 Properties gt Linker gt SubSystem Console SUBSYSTEM CONSOLE 让 Visua
  • 添加一个新的可绘制对象,它正在更改解析的 xml 的图标

    我面临着一个只有在添加新的可绘制对象时才会发生的问题 我有一个已解析的xml to Fragment the icon设置为int 如果我添加新的可绘制对象 那么它会选择随机可绘制对象来显示已解析的图标xml 我有一个Adapter为了Re
  • 求 cos 的倒数

    at http www teacherschoice com au Maths Library Trigonometry solve trig SSS htm有 使用科学计算器求出 0 25 的反余弦 C cos 1 0 25 104 47
  • Laravel - 调用未定义的方法 Illuminate\Foundation\Application::share()

    我正在从 Laravel 5 3 升级到 Laravel 5 4 问题是当我跑步时composer update当谈到php artisan optimize部分 我收到错误 Symfony Component Debug Exceptio
  • 如何唤醒休眠线程并退出主线程?

    我正在创建 10 个线程 每个线程都会执行一些任务 有 7 项任务需要完成 由于任务数量小于线程数量 因此总会有 3 个线程处于休眠状态且不执行任何操作 我的主线程必须等待任务完成 只有当所有任务完成时 即线程退出时 才退出 我正在 for
  • 更改 tomcat 上 spring mvc 应用程序的应用程序根目录

    我正在 Spring MVC 3 0 上使用示例 RESTEasy 2 0 资源并部署到 Tomcat 6 我可以通过 http localhost 8080 examples resteasy 2 1 SNAPSHOT contacts
  • 使用 python 打印 Excel 工作簿

    假设我有一个excel文件excel file xlsx我想使用 Python 将其发送到我的打印机 所以我使用 import os os startfile path to file print 我的问题是 这仅打印 Excel 工作簿的
  • 如何搜索并替换内部包含等号“=”的字符串

    我必须从像 Pippo K 5 这样的 txt 中搜索字符串并将其替换为 Pippo K 1 我需要搜索整个字符串 我所做的是 set search Pippo K 5 set replace Pippo K 1 set textFile