如何使用批处理将 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只是指向一个临时文件;


如果您想将此应用到多个文件,您应该:

  1. 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)
    
  2. 存储脚本,如replace-codes.bat;

  3. 循环调用脚本:

  • 来自命令提示符:

    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/??