Batch file 在特定单词之前批量修改text.txt

Batch file 在特定单词之前批量修改text.txt,batch-file,text-manipulation,Batch File,Text Manipulation,我有一个file.txt,其中有如下行 IF TANK T395 LEVEL ABOVE 4 THEN PUMP PFALDA395&T395 STATUS IS CLOSED 我想在其中转变 IF TANK T395 LEVEL ABOVE 4 THEN PUMP PFALDA395&T395 STATUS IS CLOSED 我试过使用这个代码。bat @echo off del "newfile.txt

我有一个file.txt,其中有如下行

IF TANK T395 LEVEL ABOVE 4 THEN PUMP PFALDA395&T395 STATUS IS CLOSED 
我想在其中转变

IF TANK T395 LEVEL ABOVE 4
THEN PUMP PFALDA395&T395 STATUS IS CLOSED                                 
我试过使用这个代码。bat

@echo off
del "newfile.txt" 2>nul
(
    for /f "eol=| usebackq for /f tokens=1,2,3,4,5,6,* delims= " %%a %%b %%c %%d %%e %%f %%g in ("oldfile.txt") do (
        for /f  %%h in ("%%g") do ( 
            if /i "%%h"=="THEN" ( 
                echo %%a %%b %%c %%d %%e %%f
                echo. %%g
            )
        )
        echo %%a %%b %%c %%d %%e %%f %%g
    )
)>"newfile.txt"
我有一个快车

%b non atteso (not waited)

我遇到了什么问题?

您试图在外部
for
命令中为所有令牌指定变量,但必须只指定第一个,在您的情况下为
%%a
;所有其他(
%%b
%%c
,…,
%%g
)都是通过
标记
选项隐式定义的(另请参见@Stephan的评论)

除此之外,代码还将原始行和拆分行输出到输出文件中。因此,我插入了一个
else
子句

最后,我实现了一个附加条件:代码现在也搜索
IF
,因此只拆分以
IF
开头并包含
THEN
作为第七个标记的行

@echo off
del "newfile.txt" 2> nul
(
    for /f "eol=| usebackq tokens=1,2,3,4,5,6,* delims= " %%a in ("oldfile.txt") do (
        if /i "%%a"=="IF" (
            for /f "eol=| tokens=1 delims= " %%h in ("%%g") do ( 
                if /i "%%h"=="THEN" ( 
                    echo %%a %%b %%c %%d %%e %%f
                    echo %%g
                ) else (
                    echo %%a %%b %%c %%d %%e %%f %%g
                )
            )
        ) else (
            echo %%a %%b %%c %%d %%e %%f %%g
        )
    )
) > "newfile.txt"

编辑:
在遵循@Aacini之后,可以简化上述解决方案:

在这里,只有一个
用于
循环,如果需要
子句,则只有一个

只需将每个
然后
替换为
然后


(我从中创建了一个换行符)

您只能对
使用一个
-变量:
用于/f”“%%a in(“oldfile.txt”)do(
%b
%c
,…是隐式的(无论如何工作;
标记=x
意味着它们)。(如
中所述)因此,关键字
THEN
是拆分文本行的唯一条件?您重复了
for/f
,请查看它,这样您的文本将按预期执行此技巧使解决方案更简单:
for/f“eol=| tokens=1-7*”%a in(“oldfile.txt”)执行if/i“%%a-%%g”eq“if-THEN”然后(echo%%a..%%f&echo%%g%%h)else echo%%a..%%h
@Aacini,谢谢你的建议!我只是复制了原始代码并插入了
if
s/
else
s,没有考虑改进其余的代码,但我会相应地编辑我的答案……我喜欢这个!
:)
@echo off
del "newfile.txt" 2> nul
(
    for /f "eol=| usebackq tokens=1-7* delims= " %%a in ("oldfile.txt") do (
        if /i "%%a|%%g"=="IF|THEN" (
            echo.%%a %%b %%c %%d %%e %%f
            echo.%%g %%h
        ) else (
            echo.%%a %%b %%c %%d %%e %%f %%g %%h
        )
    )
) > "newfile.txt"
@echo off
setlocal enabledelayedexpansion

REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%

for /f "delims=" %%a in (t.txt) do (
  set line=%%a
  echo(!line: THEN =%NL%THEN !
)