Batch file 如何在文本文件中的特定行中替换一次文本?

Batch file 如何在文本文件中的特定行中替换一次文本?,batch-file,replace,Batch File,Replace,我每天下载这些会计报告,并将其格式化为Quickbooks可以导入的格式 Quickbooks使用三行标题,第一行数据是唯一的,因为它以字符串“TRNS”开头,而下面所有的数据行都以“SPL”开头 我非常接近于实现自动化,但我很难编写一个批处理文件,将第4行的“SPL”重命名为“TRNS”,而不将“SPL”的所有实例替换为“TRNS” 以下是我在这个网站上的一些其他帖子。有没有办法让它从4号线开始,只运行一次 set "search=SPL" set "replace=TRNS" set "te

我每天下载这些会计报告,并将其格式化为Quickbooks可以导入的格式

Quickbooks使用三行标题,第一行数据是唯一的,因为它以字符串“TRNS”开头,而下面所有的数据行都以“SPL”开头

我非常接近于实现自动化,但我很难编写一个批处理文件,将第4行的“SPL”重命名为“TRNS”,而不将“SPL”的所有实例替换为“TRNS”

以下是我在这个网站上的一些其他帖子。有没有办法让它从4号线开始,只运行一次

set "search=SPL"
set "replace=TRNS"
set "textfile=Input.txt"
set "newfile=Output.txt"
(for /f "delims=" %%i in (%textfile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    echo(!line!
    endlocal
))>"%newfile%"
下面是文件当前外观的图像


谢谢

一个简单的线路计数器应该有帮助:

set "search=SPL"
set "replace=TRNS"
set "textfile=Input.txt"
set "newfile=Output.txt"
set lineNr=0
(for /f "delims=" %%i in (%textfile%) do (
    set /a lineNr+=1
    set "line=%%i"
    setlocal enabledelayedexpansion
    if !lineNr!==4 set "line=!line:%search%=%replace%!"
    echo(!line!
    endlocal
))>"%newfile%"

您可以使用
goto
循环和:

@echo关闭
rem//在子程序中执行所有操作,仅在此处重定向文件一次:
<“Input.txt”>“Output.txt”调用:SUB
退出/B
:SUB
setlocal EnableDelayedExpansion
rem/*仅在找到匹配行之前执行以下“goto”循环;
rem后面的所有内容都由单个“findstr”命令处理:*/
:循环
rem//从输入数据中读取一行:
设置“行=“&set/P行=“”
rem/*如果遇到空行,则终止子程序;
rem在没有行匹配的情况下,不需要无限循环;
超过该点的rem数据丢失:*/
如果未定义行goto:EOF
rem/*如果行以“SPL”开头,则满足以下条件;
rem将'if'替换为'if/I',以不敏感地搜索案例:*/
如果“!LINE!”==“SPL!LINE:*SPL=!”(
rem//返回修改后的行,然后继续下面的操作,离开循环:
回声(TRNS!行:*SPL=!
)否则(
rem//返回原始行:
回声(!线!
rem//跳转到循环的开头:
转到:循环
)
rem/*返回剩余数据;最后一行必须以
rem行中断,否则'findstr'可能会无限期挂起:*/
findstr“^”
端部
后藤:EOF

goto
循环速度很慢,但由于它只在遇到匹配行之前执行,根据您的描述,这是第四行,因此总体方法比使用
for/F
循环要快,特别是在后面有很多行的情况下,因为它们都是由
findstr
wi返回的但最后一行必须以换行符终止;否则,
findstr
可能会挂起(取决于Windows版本).

这是一个纯批量解决方案,只要前4行是完美的,就可以使用。非常感谢!请将文本文件的文本复制到您的问题中,而不是图像中,因为其他人可以复制它并测试他们的方法。。。
@echo off
setlocal enableDelayedExpansion
<input.txt >output.txt (
  for /l %%N in (1 1 3) do (
    set "ln="
    set /p "ln="
    echo(!ln!
  )
  set "ln="
  set /p "ln="
  echo TRNS!ln:~3!
  findstr "^"
)
jrepl "^SPL" "TRNS" /inc 4 /f input.txt /o output.txt
jrepl "^SPL" "TRNS" /inc 4 /f input.txt /o -
jrepl "^SPL" "skip=true;$txt=TRNS" /jq /f input.txt /o output.txt
jrepl "^SPL" "TRNS" /exc "/^SPL/+1:-1" /f input.txt /o output.txt