как заменить одну строку в текстовом файле, не удаляя пустые строки в пакете - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь написать простой пакетный скрипт, который может найти и заменить строку

На данный момент я нашел фрагмент, который отлично работает для моей цели, единственная проблема в том, что он удаляет пустые строки и я не могу понять, почему !!

Я пытался добавить еще один оператор if в этом цикле for, но мне не удалось Кроме того, я обнаружил, что есть летучая мышь под названием 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 голосов
/ 15 января 2019

… и в одну сторону, используя JREPL

JRepl "old \qdata\q" "new \qdata\q;" /I /XSEQ /F "t.txt" /O "t-new.txt"
0 голосов
/ 14 января 2019

Я публикую это без тестирования, поскольку у меня нет среды для тестирования, как мы говорим. Но чтобы объяснить вашу проблему, 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"

, что будет идеальным совпадением.

Примечание Я отправил сообщение со своего телефона, поэтому любые проблемы с орфографией, грамматикой и кодом я буду решать по мере прохождения ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...