批量修改特定词前text.txt
Batch modifying text.txt before a specific word
我有一个 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
我试过这个code.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
)都是通过 tokens
选项隐式定义的(另请参阅@Stephan 的评论)。
除此之外,您的代码将原始 和 分割线输出到输出文件中。因此我插入了一个 else
子句。
最后,我实现了一个附加条件:代码现在也搜索 IF
,因此只拆分以 IF
开头并包含 THEN
作为第 7 个标记的行。
@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 的 :
可以简化上述解决方案
@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"
这里只需要一个for
循环和一个if
子句。
只需将每个 <space>THEN<space>
替换为 <newline>THEN<space>
:
@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 !
)
(我从 here 中创建了一个换行符)
我有一个 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
我试过这个code.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
)都是通过 tokens
选项隐式定义的(另请参阅@Stephan 的评论)。
除此之外,您的代码将原始 和 分割线输出到输出文件中。因此我插入了一个 else
子句。
最后,我实现了一个附加条件:代码现在也搜索 IF
,因此只拆分以 IF
开头并包含 THEN
作为第 7 个标记的行。
@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 的
@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"
这里只需要一个for
循环和一个if
子句。
只需将每个 <space>THEN<space>
替换为 <newline>THEN<space>
:
@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 !
)
(我从 here 中创建了一个换行符)