2012-01-31 112 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