如何在不批量删除空行的情况下替换文本文件中的一行

how to replace one line in text file without removing empty lines in batch

我正在尝试批量编写一个可以查找和替换一行的简单脚本

到目前为止,我找到了一个非常适合我的目的的片段,唯一的问题是它删除了空行 我不知道为什么!!

我试图在此 for 循环中添加另一个 if 语句,但我失败了 我还发现有一个名为 JREPL 的 bat,我尝试 运行 文档中的几个简单命令,但我再次失败 XD

这是片段:

:Variables
set InputFile=t.txt
set OutputFile=t-new.txt
set _strFind= old "data"
set _strInsert= new "data";

:Replace
>"%OutputFile%" (
  for /f "usebackq delims=" %%A in ("%InputFile%") do (
    if "%%A" equ "%_strFind%" (echo %_strInsert%) else (echo %%A)
  )
)

我原以为这段代码不会删除我的空行 我不知道为什么

我在没有测试的情况下发布这个,因为我没有在我们说话时进行测试的环境。 但是为了解释您的问题,cmd 将省略空行,因为它是以这种方式构建的。这与将变量设置为空并期望它为 return 结果相同,因此我们只需通过模拟换行检测来为每一行分配值(不知道如何解释那个) 但是,尽管如此,我们还是会在行中添加一些额外的字符,以确保我们得到换行符,一旦有了它们,就把它们去掉,所以这里是:

@echo off
setlocal enabledelayedexpansion

set inputfile=t.txt
set outputfile=t-new.txt
set _strfind=old "data"
set _strinsert=new "data";
for /f "tokens=*" %%a in ('type "%inputfile%" ^| find /v /n "" ^& break ^> "%inputfile%"') do (
    set "str=%%a"
    set "str=!str:*]=!"
    if "!str!"=="%_strfind%" set "str=%_strinsert%"
    >>%outputfile% echo(!str!
)

应该发送到输出文件。但是,您可以使输出文件与输入文件相同,因为它与替换原始文件中的内联文本相同。一旦我能够测试,如果有任何问题,我会修复答案。

作为旁注,请注意变量中有额外白色space的地方set。例如:

set a = b

有 2 个问题,包含 space 的变量将使用 space 创建。所以它将被视为:

%a %

这样做的后果是变量的值将以 space 开头,所以当您期望 b 作为值时,它实际上变成了 b

最后,用双引号括起你的变量总是一个好主意,再次简单地消除白色space,因为:

 set a=b 

虽然肉眼看不到,但最后包含一个space,所以直接匹配如:

if "b"=="b"

将导致错误陈述,因为事实上我们有:

if "b"=="b "

所以正确的说法是将变量设置为:

set "a=b"
if "%a%"=="b"

这将是绝配。

注意 这是我从 phone 发布的,所以任何拼写、语法和代码问题我都会在回答时解决。

…还有一种使用 JREPL 的方法

JRepl "old \qdata\q" "new \qdata\q;" /I /XSEQ /F "t.txt" /O "t-new.txt"