查找并replace每行不能使用空格/多个值的脚本

我遇到了我编写的查找和replace批处理脚本的问题。 我需要能够打开一个文本文件,并从Windows命令行中更改它的一些值。 我无法安装sed.exe或FART或PowerShell,所以我需要这样做。 在linux上做这事更容易

到目前为止,我已经写了下面这个scrtip,如果我使用的是每行只有一个单词的文件,那么我可以很容易地使用以下格式

AAA
BBB
CCC

这里是batch file

@echo off setlocal enabledelayedexpansion if not exist "%1" (echo this file does not exist...)&goto :eof for /f "tokens=* delims=" %%a in (%1) do ( set write=%%a if "%%a"=="%2" set write=%3 echo !write! (echo !write!)>>%~n1.replaced%~x1 ) del %1 rename %~n1.replaced%~x1 %1 

我的问题是,我需要改变的大部分文件由多个string和数字值组成,如下所示:

AAA 1.5
BBB 25
CCC 0.1

谁能告诉我为什么我的脚本不会将BBB 25改为BBB 45 ? 分隔符是一个空格吗? 我很确定它与数字无关,就好像我有一个由空格隔开的单词文件,我的脚本也不会工作。

我一直在search论坛,并没有发现这个问题,但我会继续search。 无论如何,您的帮助将不胜感激。

UPDATE
问题解决了!! 我在DosTips.com上发现了这个 BatchSubstitute.bat的 修订版 ,只是在临时文件中添加额外的回应已经解决了我的问题。 我仍然不确定为什么我发布的代码不起作用,所以如果有人可以解释,这将是伟大的。 所有这些我都还是很新的!

更新2
以下是我需要更改的一个典型input文件:

k1 1e3
k2 2e5
1.5
×10

而我运行脚本(replace.bat prefs.txt“k1 1e3”“k1 5e4”)应该是:

k1 5e4
k2 2e5
1.5
×10

它应该能够改变文件中的任何一行。 在以前的更新论坛中的版本似乎能够工作,我只是不知道为什么我张贴的第一个版本不起作用。

回答你的update2问题。

它应该能够改变文件中的任何一行。 在以前的更新论坛中的版本似乎能够工作,我只是不知道为什么我张贴的第一个版本不起作用。

这是因为线
if "%%a"=="%2" set write=%3
将不匹配你的任何行。
由于%2将扩展为"k1 1e3"因此该行将扩展为

if "%%a"==""k1 1e3"" set write="k1 5e4"

一个简单的代字号应该可以做到
if "%%a"=="%~2" set write=%~3

是的,问题在于空格(或引号,如果你试图保持文本在一起)

使用test test.txt BBB 25 BBB 45的命令行,那么%2是BBB并且它不会匹配BBB 25因为缺少25

使用test test.txt "BBB 25" "BBB 45"的命令行,那么%2是"BBB 25" ,因为缺少引号,所以它不会匹配BBB 25