2012-01-31 116 views
1

替换找到线的一部分,我需要找到包含单词“MyWord” myfile.txt的所有行,然后替换该字符串的一部分,未来的方式:CMD脚本查找和文件

原线路:

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

更换后:

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

请帮我写这个剧本CMD!

OK ..我有下面的代码:

@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 

然后我只有一个最后一排,而不是其他别的

+0

我编辑我的答案响应您的编辑。下次请发表评论作为通知,因为stackoverflow不会通知用户有关他们回答的问题的编辑。 – MBu 2012-02-01 08:00:54

回答

1

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

这将与“01”

@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> 

如果你想只对部分线路替换值替换所有值在第3列,你可以使用内循环for /f命令if

==== EDIT

问题是与req变量的值。它包含了一个空间,所以置换后,你的第二个if语句有以下形式:

IF %%a==new request (

所以如果%%a等于new它会执行request (echo ......),然后其他人在意外确实如此。用引号括住%%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