Найдите конкретную строку в текстовом файле и обновите ее, используя командный файл - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь создать bat-файл, в который я могу передать один параметр, который будет записан в текстовый файл в очень определенном месте файла.Местоположение в файле неизвестно с самого начала, где оно находится, но его можно найти с использованием жестко закодированных значений.

Структура текстового файла:

SECTION1
value1 = 123456
value2 = asdf
value3 = 1111
SECTION2
value1 = 654321
value2 = something
value3 = 875
SECTION3
value1 = 92948
value2 = aaaaaaa
value3 = 6499

Цель состоит в том, чтобы вызватьпакетный файл следующим образом:

batch.bat somethingelse

... и затем он обновляется точно и только в SECTION2, значение2 из "что-то" в "что-то другое".Как я уже писал, я очень рад жестко закодировать «SECTION2» и «value2» в командном файле.

Это то, что у меня есть до сих пор.Это не много.Я подхожу к нему в три этапа, но, возможно, это неправильный взгляд на него:

1: Определите, с чего начинается РАЗДЕЛ2:

for /f "delims=:" %%N in ('findstr /n "SECTION2" "file.txt"') do set section=%%N
echo %section%

2: Сначало% section% найти первое вхождение значения value2 и сохранить этот номер строки:

Not sure how to accomplish this.

3: в последнем номере строки перезаписать его значением «value2 =» + что-то еще, то есть первым параметром:

This gives me what the row should look like, but I'm not sure how to actually write it.
set output=value2 = %1
echo %output%

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

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

@echo off
setlocal

rem 1: Identify where SECTION2 starts:
for /f "delims=:" %%N in ('findstr /n "SECTION2" "file.txt"') do set "section=%%N"

rem 2: From the start of %section% find the first occurrence of value2 and store that row number:
set "firstRow="
for /f "delims=:" %%N in ('findstr /n "value2" "file.txt"') do (
   if %%N gtr %section% if not defined firstRow set "firstRow=%%N"
)

rem 3: At the final row number, overwrite it with "value2 = " + somethingelse, i.e. the first parameter:
(for /F "tokens=1* delims=:" %%N in ('findstr /n "^" "file.txt"') do (
   if %%N neq %firstRow% (
      echo %%O
   ) else (
      echo value2 = %1
   )
)) > newFile.txt

rem Final step: update the new file
move /Y newFile.txt file.txt
0 голосов
/ 27 ноября 2018

Это гораздо проще сделать с помощью языка сценариев, использующего полнофункциональные регулярные выражения, такие как PowerShell, который является частью windows начиная с версии 7 (для параметра -raw требуется PSv3 +).

Чтобы быть на одной теме с одним вкладышем PowerShellупакован в пакет:

powershell -NoP -C "(gc .\file.txt -raw) -replace '(?SM)(?<=SECTION2.*?value2 = ).*?$(?=.*?^[^=]+$)','somethingelse'|Set-Content .\file.txt"

В регулярном выражении используется (положительное значение) поисков только для совпадения значения 2 между SECTION2 / 3

Пример вывода:

SECTION1
value1 = 123456
value2 = asdf
value3 = 1111
SECTION2
value1 = 654321
value2 = somethingelse
value3 = 875
SECTION3
value1 = 92948
value2 = aaaaaaa
value3 = 6499
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...