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

问题描述 投票:0回答:1

即使经过深入的谷歌搜索,我也无法解决我的问题。 有一个名为 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

谢谢! 罗尼

batch-file text replace
1个回答
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
但使用 [SpaceTab,;] 作为分隔符,因此你只得到字符串
Root:
与你的代码(最多但不包括默认分隔符) )

对于/?

来自文档提示。

语法

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

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

usebackq
选项。

整行被分配给

%%G
(注意:除了空行和以;

开头的行)

然后是一个简单的

if
语句 - if“行内容”==“目标内容”。引号是必需的,因为引号将“包含分隔符的字符串”分组为一个字符串,并且
if
语法为
if string
运算符 string2 (dothis) else (dothat)`

请注意,左括号必须与 do 位于同一物理行,if 也是如此。 else,前面的闭括号和后面的开括号必须位于同一物理行,且之间有一个空格。

请注意

ECHO(
的使用,如果
echo
(在本例中)没有值,则
%%G
会成为空行。就嵌套而言,
(
不算在内。

(这里的%%G必须有一个值 - 但在一般情况下,如果

echo %var%
未定义,
echo is on/off
将产生
var
,但
echo(%var%
将干净地产生一个新行)。

© www.soinside.com 2019 - 2024. All rights reserved.