如何使用批处理将 txt 文件中的一行替换为新行
How can I replace a line with a new line in a txt file using batch
我需要一点帮助
我有一个我无法运行的脚本,我尝试用不同的方式重写它
这是我的脚本
@echo off
set "Find="code1": 123456789,"
set "Replace="code1": 9999999999,"
set "source=File.txt"
set "target=result.txt"
setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%Find%=%Replace%!"
echo(!line!
)
) > %target%
endlocal
这很好用,但前提是我有完全匹配的
set "Find="code1": 123456789,"
我想要的是 Find
只搜索 code name
set "Find="code1":"
或 "\"code1"\"
或 set "Find="code1":*"
原因是因为每个 file.txt
对于每个 code
都有不同的 values
,我将查找。 Replace value
对于我将处理的每个 file.txt
都是相同的,每个 file.txt
最多可以有 15 个代码用于 Find
这是我的目标 我想用新行替换发现 code 1
的整行,或者至少替换 :
之后和 ,
[=57= 之前的任何内容]
这是我的部分内容
file.txt - all these codes will always be different in every txt file
so the `Find` needs to search like a wildcard
---content inside the file
"fgrh": 442304728, < --- Code1
"fdhe": 93075936,
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 117518,
"dsds": 38785,
"iags": 0,
"yhgv": 180035,
"ijnh": 51650,
"igbk": 0,
"ncde": 22935,
"jnhy": 7450,
"igsk": 0,
"oihs": 1492,
"ygbj": 60,
"iggk": 0,
New Codes to replace old codes
all these codes will always remain the same for every file I work on
RESULTS
"fgrh": 1251472, < --- Code1
"fdhe": 12542,
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 52142,
"dsds": 1342,
"iags": 0,
"yhgv": 14755,
"ijnh": 4258,
"igbk": 0,
"ncde": 85411,
"jnhy": 3581,
"igsk": 0,
"oihs": 200,
"ygbj": 10,
"iggk": 0,
是否可以制作这样的脚本 请注意,下面的脚本只是一个例子,我放 < --- Code
只是为了说明我为什么使用代码 1、代码 2 等 < ---- code is not apart of the script
@echo off
set "find="
"fgrh": *, < --- Code1
"fdhe": *, < --- Code2
"rpsp": 0,
"pcbp": 0.0,
"dgcb": *, < --- Code3
"dsds": *, < --- Code4
"iags": 0,
"yhgv": *, < --- Code5
"ijnh": *, < --- Code6
"igbk": 0,
"ncde": *, < --- Code7
"jnhy": *, < --- Code8
"igsk": 0,
"oihs": *, < --- Code9
"ygbj": *, < --- Code10
"iggk": 0,
set "replace="
"fgrh": 1251472, < --- Code1
"fdhe": 12542, < --- Code2
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 52142, < --- Code3
"dsds": 1342, < --- Code4
"iags": 0,
"yhgv": 14755, < --- Code5
"ijnh": 4258, < --- Code6
"igbk": 0,
"ncde": 85411, < --- Code7
"jnhy": 3581, < --- Code8
"igsk": 0,
"oihs": 200, < --- Code9
"ygbj": 10, < --- Code10
"iggk": 0,
set "source=File.txt"
set "target=result.txt"
setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%Find%=%Replace%!"
echo(!line!
)
) > %target%
endlocal
我还想删除 %target% 并使其编辑当前 file.txt
通过这样做我有一个想法
) > %target% to ) >> %source%
不确定是否需要其他任何东西来删除目标
任何帮助都会很棒
根据我的理解,以下脚本应该执行您想要的操作:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_FILE=%~dp0file.txt" & rem // (path to file to be edited; `%~dp0` is script parent)
set "_CODE=%~dp0code.txt" & rem // (path to file containing new codes to become applied)
set "_TMPF=%~dp0file.tmp" & rem // (path to temporary file)
rem // Write to temporary file:
> "%_TMPF%" (
rem // Loop through lines of file, each one preceded with line number plus `:`:
for /F "delims=" %%L in ('findstr /N "^" "%_FILE%"') do (
rem // Store current line (including line number prefix):
set "LINE=%%L"
rem // Try to extract text portion between prefix and next `:`:
for /F "tokens=2 delims=: " %%K in ("%%L") do (
rem // Check whether text portion is `"` plus anything plus `"`:
cmd /V /D /C echo(!LINE:*:^=!| findstr "^ *\"[^^^":][^^^":]*\"" > nul && (
rem // Text portion complies with pattern, hence store such:
set "CODE=%%K"
rem // Toggle delayed expansion to avoid troubles with `!` and `^`:
setlocal EnableDelayedExpansion
rem // Escape most `findstr` meta-characters (`*` it not handled!):
for %%J in ("\" "." "^" "$" "[" "]" ""^") do set "CODE=!CODE:%%~J=\%%~J!"
rem // Return line beginning with same text portion from other file:
findstr /R /C:"^^ *!CODE!:" "!_CODE!" || echo(!LINE:*:=!
endlocal
) || (
rem // Text portion does not comply, hence return original line:
setlocal EnableDelayedExpansion
echo(!LINE:*:=!
endlocal
)
)
)
)
rem // Replace original file:
move /Y "%_TMPF%" "%_FILE%" > nul
endlocal
exit /B
您需要在脚本顶部指定一些文件路径:
变量_FILE
必须指向包含原始代码的文件:
"code1": 123456789,
"code2": 123123123,
"code3": 456456456,
变量 _CODE
必须指向包含要使用的新代码的文件:
"code1": 9999999,
"code2": 9999999,
"code3": 9999999,
变量_TMPF
只是指向一个临时文件;
如果您想将此应用到多个文件,您应该:
将 rem // Define constants here:
部分更改为:
rem // Define constants here:
set "_FILE=%~1" & rem // (path to file to be edited; `%~1` is first argument)
set "_CODE=%~2" & rem // (path to file containing new codes to become applied)
set "_TMPF=%TEMP%\%~n0_%RANDOM%.tmp" & rem // (path to temporary file)
存储脚本,如replace-codes.bat
;
循环调用脚本:
来自命令提示符:
for %I in ("*.txt") do call replace-codes.bat "%~I" "code.txt"
来自另一个批处理文件:
for %%I in ("*.txt") do call replace-codes.bat "%%~I" "code.txt"
编辑:(根据各种改变游戏规则的评论完成返工)
不是batch,弱到无法解决问题,是你的问题弱到无法回答。根据问题定制解决方案,只是被评论为“不错,但不起作用,因为事实与问题中描述的不同”,这非常令人沮丧。当您描述 确切 问题而不是一些“虚假事实”时,您会在这里得到更好的回应。
File.txt
"fgrh": 442304728, < --- Code1
"fdhe": 93075936,
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 117518,
"dsds": 38785,
"iags": 0,
"yhgv": 180035,
"ijnh": 51650,
"igbk": 0,
"ncde": 22935,
"jnhy": 7450,
"igsk": 0,
"oihs": 1492,
"ygbj": 60,
"iggk": 0,
Replacements.txt
"fgrh": 1251472, < --- Code1
"fdhe": 12542, < --- Code2
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 52142, < --- Code3
"dsds": 1342, < --- Code4
"iags": 0,
"yhgv": 14755, < --- Code5
"ijnh": 4258, < --- Code6
"igbk": 0,
"ncde": 85411, < --- Code7
"jnhy": 3581, < --- Code8
"igsk": 0,
"oihs": 200, < --- Code9
"ygbj": 10, < --- Code10
"iggk": 0,
或
"fgrh": 1251472, < --- Code1
"fdhe": 12542, < --- Code2
"dgcb": 52142, < --- Code3
"dsds": 1342, < --- Code4
"yhgv": 14755, < --- Code5
"ijnh": 4258, < --- Code6
"ncde": 85411, < --- Code7
"jnhy": 3581, < --- Code8
"oihs": 200, < --- Code9
"ygbj": 10, < --- Code10
Script.bat
@echo off
setlocal
set "source=File.txt"
set "target=result.txt"
set "replacements=replacements.txt"
copy /Y "%source%" "%target%" >nul
for /f "usebackq tokens=1,* delims=: " %%a in ("%replacements%") do (
call jrepl "\q%%a\q.*" "\q%%a\q: %%b" /XSEQ /f "%target%" /o -
)
goto :eof
Result.txt(与replacements.txt
的两个版本相同)
"fgrh": 1251472, < --- Code1
"fdhe": 12542, < --- Code2
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 52142, < --- Code3
"dsds": 1342, < --- Code4
"iags": 0,
"yhgv": 14755, < --- Code5
"ijnh": 4258, < --- Code6
"igbk": 0,
"ncde": 85411, < --- Code7
"jnhy": 3581, < --- Code8
"igsk": 0,
"oihs": 200, < --- Code9
"ygbj": 10, < --- Code10
"iggk": 0,
我正在使用 jrepl.bat,因为它具有完整的 REGEX 功能,这让生活变得更加轻松。
jrepl.bat
的完整文档是内置的,可以阅读 jrepl /?
或更详细的 jrepl/??
我需要一点帮助
我有一个我无法运行的脚本,我尝试用不同的方式重写它
这是我的脚本
@echo off
set "Find="code1": 123456789,"
set "Replace="code1": 9999999999,"
set "source=File.txt"
set "target=result.txt"
setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%Find%=%Replace%!"
echo(!line!
)
) > %target%
endlocal
这很好用,但前提是我有完全匹配的
set "Find="code1": 123456789,"
我想要的是 Find
只搜索 code name
set "Find="code1":"
或 "\"code1"\"
或 set "Find="code1":*"
原因是因为每个 file.txt
对于每个 code
都有不同的 values
,我将查找。 Replace value
对于我将处理的每个 file.txt
都是相同的,每个 file.txt
最多可以有 15 个代码用于 Find
这是我的目标 我想用新行替换发现 code 1
的整行,或者至少替换 :
之后和 ,
[=57= 之前的任何内容]
这是我的部分内容
file.txt - all these codes will always be different in every txt file
so the `Find` needs to search like a wildcard
---content inside the file
"fgrh": 442304728, < --- Code1
"fdhe": 93075936,
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 117518,
"dsds": 38785,
"iags": 0,
"yhgv": 180035,
"ijnh": 51650,
"igbk": 0,
"ncde": 22935,
"jnhy": 7450,
"igsk": 0,
"oihs": 1492,
"ygbj": 60,
"iggk": 0,
New Codes to replace old codes
all these codes will always remain the same for every file I work on
RESULTS
"fgrh": 1251472, < --- Code1
"fdhe": 12542,
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 52142,
"dsds": 1342,
"iags": 0,
"yhgv": 14755,
"ijnh": 4258,
"igbk": 0,
"ncde": 85411,
"jnhy": 3581,
"igsk": 0,
"oihs": 200,
"ygbj": 10,
"iggk": 0,
是否可以制作这样的脚本 请注意,下面的脚本只是一个例子,我放 < --- Code
只是为了说明我为什么使用代码 1、代码 2 等 < ---- code is not apart of the script
@echo off
set "find="
"fgrh": *, < --- Code1
"fdhe": *, < --- Code2
"rpsp": 0,
"pcbp": 0.0,
"dgcb": *, < --- Code3
"dsds": *, < --- Code4
"iags": 0,
"yhgv": *, < --- Code5
"ijnh": *, < --- Code6
"igbk": 0,
"ncde": *, < --- Code7
"jnhy": *, < --- Code8
"igsk": 0,
"oihs": *, < --- Code9
"ygbj": *, < --- Code10
"iggk": 0,
set "replace="
"fgrh": 1251472, < --- Code1
"fdhe": 12542, < --- Code2
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 52142, < --- Code3
"dsds": 1342, < --- Code4
"iags": 0,
"yhgv": 14755, < --- Code5
"ijnh": 4258, < --- Code6
"igbk": 0,
"ncde": 85411, < --- Code7
"jnhy": 3581, < --- Code8
"igsk": 0,
"oihs": 200, < --- Code9
"ygbj": 10, < --- Code10
"iggk": 0,
set "source=File.txt"
set "target=result.txt"
setlocal enableDelayedExpansion
(
for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do (
set "line=%%b"
if defined line set "line=!line:%Find%=%Replace%!"
echo(!line!
)
) > %target%
endlocal
我还想删除 %target% 并使其编辑当前 file.txt
通过这样做我有一个想法
) > %target% to ) >> %source%
不确定是否需要其他任何东西来删除目标
任何帮助都会很棒
根据我的理解,以下脚本应该执行您想要的操作:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_FILE=%~dp0file.txt" & rem // (path to file to be edited; `%~dp0` is script parent)
set "_CODE=%~dp0code.txt" & rem // (path to file containing new codes to become applied)
set "_TMPF=%~dp0file.tmp" & rem // (path to temporary file)
rem // Write to temporary file:
> "%_TMPF%" (
rem // Loop through lines of file, each one preceded with line number plus `:`:
for /F "delims=" %%L in ('findstr /N "^" "%_FILE%"') do (
rem // Store current line (including line number prefix):
set "LINE=%%L"
rem // Try to extract text portion between prefix and next `:`:
for /F "tokens=2 delims=: " %%K in ("%%L") do (
rem // Check whether text portion is `"` plus anything plus `"`:
cmd /V /D /C echo(!LINE:*:^=!| findstr "^ *\"[^^^":][^^^":]*\"" > nul && (
rem // Text portion complies with pattern, hence store such:
set "CODE=%%K"
rem // Toggle delayed expansion to avoid troubles with `!` and `^`:
setlocal EnableDelayedExpansion
rem // Escape most `findstr` meta-characters (`*` it not handled!):
for %%J in ("\" "." "^" "$" "[" "]" ""^") do set "CODE=!CODE:%%~J=\%%~J!"
rem // Return line beginning with same text portion from other file:
findstr /R /C:"^^ *!CODE!:" "!_CODE!" || echo(!LINE:*:=!
endlocal
) || (
rem // Text portion does not comply, hence return original line:
setlocal EnableDelayedExpansion
echo(!LINE:*:=!
endlocal
)
)
)
)
rem // Replace original file:
move /Y "%_TMPF%" "%_FILE%" > nul
endlocal
exit /B
您需要在脚本顶部指定一些文件路径:
变量
_FILE
必须指向包含原始代码的文件:"code1": 123456789, "code2": 123123123, "code3": 456456456,
变量
_CODE
必须指向包含要使用的新代码的文件:"code1": 9999999, "code2": 9999999, "code3": 9999999,
变量
_TMPF
只是指向一个临时文件;
如果您想将此应用到多个文件,您应该:
将
rem // Define constants here:
部分更改为:rem // Define constants here: set "_FILE=%~1" & rem // (path to file to be edited; `%~1` is first argument) set "_CODE=%~2" & rem // (path to file containing new codes to become applied) set "_TMPF=%TEMP%\%~n0_%RANDOM%.tmp" & rem // (path to temporary file)
存储脚本,如
replace-codes.bat
;循环调用脚本:
来自命令提示符:
for %I in ("*.txt") do call replace-codes.bat "%~I" "code.txt"
来自另一个批处理文件:
for %%I in ("*.txt") do call replace-codes.bat "%%~I" "code.txt"
编辑:(根据各种改变游戏规则的评论完成返工)
不是batch,弱到无法解决问题,是你的问题弱到无法回答。根据问题定制解决方案,只是被评论为“不错,但不起作用,因为事实与问题中描述的不同”,这非常令人沮丧。当您描述 确切 问题而不是一些“虚假事实”时,您会在这里得到更好的回应。
File.txt
"fgrh": 442304728, < --- Code1
"fdhe": 93075936,
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 117518,
"dsds": 38785,
"iags": 0,
"yhgv": 180035,
"ijnh": 51650,
"igbk": 0,
"ncde": 22935,
"jnhy": 7450,
"igsk": 0,
"oihs": 1492,
"ygbj": 60,
"iggk": 0,
Replacements.txt
"fgrh": 1251472, < --- Code1
"fdhe": 12542, < --- Code2
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 52142, < --- Code3
"dsds": 1342, < --- Code4
"iags": 0,
"yhgv": 14755, < --- Code5
"ijnh": 4258, < --- Code6
"igbk": 0,
"ncde": 85411, < --- Code7
"jnhy": 3581, < --- Code8
"igsk": 0,
"oihs": 200, < --- Code9
"ygbj": 10, < --- Code10
"iggk": 0,
或
"fgrh": 1251472, < --- Code1
"fdhe": 12542, < --- Code2
"dgcb": 52142, < --- Code3
"dsds": 1342, < --- Code4
"yhgv": 14755, < --- Code5
"ijnh": 4258, < --- Code6
"ncde": 85411, < --- Code7
"jnhy": 3581, < --- Code8
"oihs": 200, < --- Code9
"ygbj": 10, < --- Code10
Script.bat
@echo off
setlocal
set "source=File.txt"
set "target=result.txt"
set "replacements=replacements.txt"
copy /Y "%source%" "%target%" >nul
for /f "usebackq tokens=1,* delims=: " %%a in ("%replacements%") do (
call jrepl "\q%%a\q.*" "\q%%a\q: %%b" /XSEQ /f "%target%" /o -
)
goto :eof
Result.txt(与replacements.txt
的两个版本相同)
"fgrh": 1251472, < --- Code1
"fdhe": 12542, < --- Code2
"rpsp": 0,
"pcbp": 0.0,
"dgcb": 52142, < --- Code3
"dsds": 1342, < --- Code4
"iags": 0,
"yhgv": 14755, < --- Code5
"ijnh": 4258, < --- Code6
"igbk": 0,
"ncde": 85411, < --- Code7
"jnhy": 3581, < --- Code8
"igsk": 0,
"oihs": 200, < --- Code9
"ygbj": 10, < --- Code10
"iggk": 0,
我正在使用 jrepl.bat,因为它具有完整的 REGEX 功能,这让生活变得更加轻松。
jrepl.bat
的完整文档是内置的,可以阅读 jrepl /?
或更详细的 jrepl/??