.bat Как заменить текст и сохранить пустые строки - PullRequest
0 голосов
/ 01 августа 2020

Приведенный ниже код сохраняет пробел перед каждой строкой в ​​example.yaml. Однако он удаляет все пустые строки И, что наиболее важно, он даже не заменяет текст.

Кто-нибудь знает, как отредактировать этот код, чтобы он:

  1. Сохранял пустые строки
  2. Заменить "filters:" на "filters:! Yaml_filters!"
@echo off
echo how many filters
set /p yaml_filters=

for /f "delims=" %%i in ('"FINDSTR /B filters: example.yaml"') do set edit_line=%%i
SETLOCAL=ENABLEDELAYEDEXPANSION
        rename example.yaml example.tmp
        for /f "delims=" %%a in (example.tmp) do (
            set foo=%%a
            if "!foo!"=="%edit_line%" (set foo=filters: !yaml_filters!)
            echo !foo! >> example.yaml)                                       
    del example.tmp

Ответы [ 3 ]

2 голосов
/ 01 августа 2020

Как уже отмечали другие, пакетная обработка не является хорошим инструментом для этой задачи (не говоря уже о том, что это невозможно, но есть много предостережений и причуд.

Если вы готовы принять сторонний инструмент, Я рекомендую jrepl.bat, который делает ваш скрипт всего из трех строк (без необходимости беспокоиться о специальных символах, пустых строках или начальных (или конечных) пробелах или табуляциях):

@echo off
set /p "yaml_filters=how many filters: "
call jrepl.bat "filters: \d*" "filters: %yaml_filters%" /f example.yaml /o -

Если после этого нет другого кода , вы даже можете поцарапать команду call.

Ссылка для загрузки jrepl.bat . Автор dbenham является очень уважаемым и доверенным участником StackOverflow.

0 голосов
/ 01 августа 2020

Редактирование yaml файлов с помощью командных файлов - не самая лучшая идея, но это то, что вы просите, поэтому я дам вам решение. Некоторые примечания:

  1. Файл не может содержать !, так как он будет пропускать символы из-за delayedexpansion
  2. Строка, которую вы ищете, должна точно совпадать, она не может быть неполной строкой поскольку мы не выполняем сопоставление частичных строк (подстрок), поэтому убедитесь, что вы понимаете, что если вы хотите сопоставить части строки, вам необходимо изменить сценарий для этого.
@echo off
set "myfile=example.yaml"
set "search=line to match"
set /p "replace=How many filters: "
for /f "tokens=1*delims=[]" %%a in ('type "%myfile%" ^| find /v /n "" ^& break ^> "%myfile%"') do (
       set "line=%%b"
       setlocal enabledelayedexpansion
       if "!line!"=="%search%" set "line=filters: !replace!"
       (echo(!line!)>>"%myfile%"
       endlocal
)
0 голосов
/ 01 августа 2020

Вы не так уж и далеко:

@Echo Off & Setlocal EnableDelayedExpansion & CD "%~dp0"
rem // Qualify Parameters
If "%~3"=="" (Echo/^<Input File.ext^> ^<Search String^> ^<Insertion String^> & Exit /B 1)
rem // declare source file %1
  Set "Input=%~1"
  If not Exist "%Input%" Exit /B 1
rem // ensure no conflicting output file
  If Exist "tmp!Input!" Del /Q "tmp!Input!"
rem // iterate over source and output lines modified according to search pattern %2 and injected string %3
  For /F "Tokens=* Delims=" %%A in (!Input!) Do (
    Set "Line=%%A"
    ((Echo/!Line! | Findstr /B /I /L "%~2" >Nul 2> Nul) && Set "Line=%~2 %~3")
    Echo/!Line!
  )>>"tmp!input!"
rem // cleanup
  Del /Q "!input!"
  Set "RenFile=REN tmp!input! !input!"
  %RenFile%
  Endlocal & Exit /B 0

Примечание: Скрипт должен вызываться с указанными параметрами - я не делаю привычки публиковать «точное» решения, поскольку я считаю, что лучше дать универсальный ответ, который может быть легко использован другими людьми с аналогичными вопросами / проблемами

...