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

时间:2012-07-06 13:31:54

标签: windows string command-line batch-file replace

我遇到了一个问题& amp;替换我写过的批处理脚本。我需要能够打开一个文本文件并从Windows命令行更改其中的一些值。我无法安装sed.exe或FART或powershell所以我需要这样做。 在linux中做起来要容易得多....

到目前为止,我已经编写了以下scrtipt,如果我使用的文件每行只有一个单词,那么它可以很好地工作,因此我可以轻松地按以下格式更改文件

  

AAA
  BBB
  ccc

这是批处理文件:

@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

我的问题是我需要更改的大多数文件都包含多个字符串和数字值的行,如下所示:

  

AAA 1.5
  BBB 25
  CCC 0.1

有谁可以告诉我为什么我的脚本不会将 BBB 25 更改为 BBB 45 ?是否与分隔符是一个空间有关?我很确定它与数字无关,好像我有一个用空格分隔的单词文件,我的脚本也无法正常工作。

我一直在搜索论坛,但还没有发现这个问题,但我会继续搜索。无论如何,我们将非常感谢您的帮助。

更新
问题解决了!!我在DosTips.com上找到了this revision BatchSubstitute.bat,只是在临时文件中添加了额外的回声已经解决了我的问题。我仍然不确定为什么我发布的代码不起作用,所以如果有人能解释它会很棒。我对这一切还很陌生!!

更新2
这是我需要更改的典型输入文件:

  

k1 1e3
  k2 2e5
  n 1.5
  x 10

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

  

k1 5e4
  k2 2e5
  n 1.5
  x 10

它应该能够更改文件中的任何行。上一次更新中论坛中的版本似乎能够正常工作,我只是不知道为什么我发布的第一个版本不起作用。

2 个答案:

答案 0 :(得分:1)

回答您的update2问题。

  

它应该能够更改文件中的任何行。上一次更新中论坛中的版本似乎能够正常工作,我只是不知道为什么我发布的第一个版本不起作用。

这是因为线路 if "%%a"=="%2" set write=%3
不符合你的任何一条线 由于%2会扩展为"k1 1e3",因此该行会扩展为

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

一个简单的代字号应该可以解决问题 if "%%a"=="%~2" set write=%~3

答案 1 :(得分:0)

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

使用test test.txt BBB 25 BBB 45的命令行,然后%2为BBB,因为25缺少,所以它不会与BBB 25匹配

使用test test.txt "BBB 25" "BBB 45"的命令行,然后%2为"BBB 25",因为缺少引号,它不会与BBB 25匹配。