通过Windows批处理文件在文本文件中查找并替换行开头的特定值

时间:2016-01-20 13:10:52

标签: batch-file text replace

即使在Googeling之后我也无法解决我的问题。 有一个名为test.txt的文本文件。我需要的是使用批处理文件更改行开头的单词“Root:”和其他内容。

setLocal EnableDelayedExpansion    
FINDSTR /B Root: test.txt 
::returns the correct line - works well
for /f %%i in ('FINDSTR /B Root: test.txt') do set root=%%i

echo %root%
::echos "Root:" - instead of the line content

FOR /F "tokens=*" %%G IN (test.txt) DO 
(set x=%%G
if !x!==%root% set x=Hello
echo !x! >> test.txt)
::The syntax of the command is incorrect.

我该怎么做?

修改: 基于Magoo和RobW在Batch / Find And Edit Lines in TXT file - 我的问题解决如下:

for /f "tokens=*" %%i in ('"FINDSTR /B Root: test.txt"') do set root=%%i
::root holds test.txt's line starts with "Root:"
echo %root%

SETLOCAL=ENABLEDELAYEDEXPANSION
::iterate on test.txt's lines and compare to the root's value
        rename test.txt test.tmp
        for /f "tokens=*" %%a in (test.tmp) do (
            set foo=%%a
            echo !foo!
            echo %root%
            echo "%root%"
            if "!foo!"=="%root%" (set foo=hello)
            echo !foo! >> test.txt)                                       
    del test.tmp

谢谢! 罗尼

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q34900978.txt"

FINDSTR /B Root: "%filename1%" 
::returns the correct line - works well
FOR /f "tokens=*" %%i IN (
 'FINDSTR /B Root: "%filename1%"
') do set "root=%%i"

echo %root%
::echos "Root:" - instead of the line content

FOR /F "usebackqdelims=" %%G IN ("%filename1%") DO (
 if "%%G"=="%root%" (
  ECHO(x=Hello
 ) ELSE (
 ECHO(%%G
 )
)

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

我使用了一个名为q34900978.txt的文件,其中包含一些虚拟数据供我测试。

tokens=*(或for...%%i)中的delims=选项会将整行分配给"令牌1"从而进入元变量%%i

默认为分配token 1,但使用[ Space Tab ; ]为分隔符,因此您只需使用代码获取字符串Root:(最多但不包括默认分隔符)

  

for /?

来自文档提示。

语法SET "var=value"(其中value可以为空)用于确保任何杂散尾随空格不包含在分配的值中。 set /a可以安全地使用"无报"。

下一步是处理文件。同样的故事(但由于我引用文件名并提供完整路径,我需要usebackq选项。

整行被分配到%%G(注意:除了空行和行开头;

然后它是一个简单的if声明 - 如果"行内容" =="目标内容"。引号是必需的,因为引用组"包含分隔符的字符串"一个字符串和if语法是if string运算符string2(dothis)else(dothat)`

请注意,左括号必须与执行位于同一物理行,而如果则相同。 else ,前面的近括号和后面的左括号必须都在同一物理行上,并且它们之间有空格。

请注意使用ECHO( echo如果%%G(在这种情况下)没有值,则(为空行。就嵌套而言,echo %var%不计算在内。

(%% G必须有一个值 - 但在一般情况下,如果echo is on/off未定义,则var将产生echo(%var%,但{{1}}将干净地生成新行)