CMD脚本,用于查找和替换文件中已找到行的一部分

时间:2012-01-31 08:14:59

标签: cmd

我需要在myfile.txt中找到包含单词'MyWord'的所有行,然后在下一行中替换该字符串的一部分:

原帖:

 ...,31-01-2012,00,some_words_and_symbols_and_digits,MyWord,...

更换后:

 ...,31-01-2012,01,some_words_and_symbols_and_digits,MyWord,...

请帮我写这个cmd脚本!

好的..我有下一个代码:

@echo off
set code=MyWord
set req=new request

FOR /F "usebackq delims=, tokens=1,2,3,4,5,6,7,8,9*" %%a in (MyFile.txt) do (

IF %%h==%code% (
    SET tempstr=%%a,%%b,%%c,%%d,60,%%f,%%g,%%h,%%i
    ) ELSE (
    SET tempstr=%%a,%%b,%%c,%%d,%%e,%%f,%%g,%%h,%%i
    ) 

IF %%a==%req% (
    SET echo %%a >> new.strings
    ) ELSE (
    echo %tempstr% >> new.strings
    )

)
@echo on

我的文件中有这样的内容:

 new request
 ...,31-01-2012,01,some_words_and_symbols_and_digits,MyWord,...
 new request
 ...,30-11-2011,01,some_words_and_symbols_and_digits,OtherWords,...

但后来我有错误:

ELSE was unexpected at this time.

如果我在下一步尝试简单

IF %%a==%req% SET tempstr=%%a
echo %tempstr% >> new.strings

然后我只有最后一行而不是其他的

1 个答案:

答案 0 :(得分:1)

您可以使用find命令过滤包含给定文本的行。如我所见,该文件是CSV。因此,您可以使用for /f来解析找到的行。然后,您可以echo替换所需字段的所有已解析文件。

这将使用“01”

替换第3列中的所有值
@echo off
for /f "usebackq delims=, tokens=1,2,3,4,<put as many as you need>" %%A in (`find "MyWord" myfile.txt`) do echo %%A,%%B,01,%%D,<as many %%letters as tokens>

如果只想在某些行上替换值,可以在if循环中使用for /f命令。

====编辑

问题在于req变量的值。它包含一个空格,因此在替换之后,您的第二个if语句具有以下形式:

IF %%a==new request (

因此,如果%%a等于new,它将执行request ( echo ...... ),然后ELSE确实是意外的。将%%a%req%括在引号中,问题就会消失。

但我也看到了其他问题。首先,在第二个if语句中有冗余set。 其次,您需要使用延迟扩展变量,否则echo %tempstr%将无效。

需要更改后的代码:

@Echo off
setlocal enabledelayedexpansion

set code=MyWord
set req=new request

FOR /F "usebackq delims=, tokens=1,2,3,4,5,6,7,8,9*" %%a in (MyFile.txt) do (

  IF %%h==%code% (
    SET tempstr=%%a,%%b,%%c,%%d,60,%%f,%%g,%%h,%%i
  ) ELSE (
    SET tempstr=%%a,%%b,%%c,%%d,%%e,%%f,%%g,%%h,%%i
  ) 

  IF "%%a"=="%req%" (
    echo %%a >> new.strings
  ) ELSE (
    echo !tempstr! >> new.strings
  )
)

endlocal