我正在尝试批量编写一个简单的脚本,该脚本可以查找和替换一行
到目前为止,我已经找到了一个片段,该片段对于我的目的而言效果很好,唯一的问题是它删除了空行 而且我不知道为什么!
我试图在此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)
)
)
我期望这个代码片段不会删除我的空行 我不知道为什么
答案 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"