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

时间:2019-01-14 20:06:01

标签: windows batch-file

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

到目前为止,我已经找到了一个片段,该片段对于我的目的而言效果很好,唯一的问题是它删除了空行 而且我不知道为什么!

我试图在此for循环中添加另一个if语句,但失败 我还发现有一个名为JREPL的蝙蝠,我试图从文档中运行一些简单的命令,但我再次失败了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)
  )
)

我期望这个代码片段不会删除我的空行 我不知道为什么

2 个答案:

答案 0 :(得分:2)

我发布此内容时没有进行测试,因为我在讲话时没有测试环境。 但是,为了解释您的问题,cmd将省略以这种方式构建的空行。这与将变量设置为空并期望其返回结果相同,因此我们可以通过模拟对换行符的检测来简单地为每行赋值(不知道确切地解释该变量),但是,我们将在行中添加一些其他字符,以确保我们得到换行符,一旦拥有换行符,就将其删除,所以去了:

@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!
)

应该将其发送到输出文件。但是,您可以使输出文件与输入相同,然后将其替换为替换原始文件中的内联文本。一旦能够测试,就可以解决答案。

请注意,set在变量中的其他空格处要格外小心。例如:

set a = b

有2个问题,变量,将在空格后创建一个空格。因此它将被视为:

%a %

其后果是变量的值将以前导空格开头,因此当您期望b作为值时,实际上它变成了b

最后,将变量用双引号引起来总是一个好主意,只是为了消除空格而已,因为:

 set a=b 

即使您无法用肉眼看到它,它的末尾也有一个空格,因此可以直接匹配:

if "b"=="b"

事实上,我们会得到一个错误的陈述

if "b"=="b "

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

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

这将是一个完美的选择。

注意我是通过手机发布的,因此我在回答时会解决所有拼写,语法和代码问题。

答案 1 :(得分:0)

…以及使用JREPL的一种方法

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