如何在不批量删除空行的情况下替换文本文件中的一行
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"
我正在尝试批量编写一个可以查找和替换一行的简单脚本
到目前为止,我找到了一个非常适合我的目的的片段,唯一的问题是它删除了空行 我不知道为什么!!
我试图在此 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"