我需要在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
然后我只有最后一行而不是其他的
答案 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