Как удалить выбранный номер строки после поиска - PullRequest
0 голосов
/ 12 марта 2020

Я хотел бы удалить выбранный номер строки после строки, которую я найду. В настоящее время я только нахожу строку и удаляю эту. Я хотел бы удалить 2 строки вверх и вниз после моей строки.

 @echo off
    type file.txt | find /v "toto" | find /v "tata" > outputfile.txt

и мой файл выглядит так:

<KeyValuePairs>
 <ObjectID></ObjectID>
 <Key>toto</Key>
 <Value />
</KeyValuePairs>

Итак, чтобы объяснить, мой сценарий найти строку "ключ "и я хочу удалить все мои KeyValuePairs.

На самом деле я пытаюсь сосчитать всю мою строку в моем файле

for /f "tokens=*" %%i in ('type file.txt') do (
    set /a nb+=1
    )
echo %nb%

, но это позволило моему" nb "равному 0. Вы знаете где проблема? спасибо за вашу помощь!

1 Ответ

0 голосов
/ 13 марта 2020

Вот чистая пакетная реализация вашей стратегии. Код сильно комментируется, чтобы объяснить, как он работает. Код должен работать так же хорошо, как пакетные сценарии go. Небольшие изменения в формате исходного файла могут легко испортить код, но это неотъемлемый риск для вашего дизайна.

@echo off
setlocal
set "input=file.txt"
set "output=output.txt"
set "tempFile=find.txt"

:: Prepare find.txt containing all the line numbers that should be excluded.
:: Each line consists of a line number followed by a colon.
:: The findstr lists the lines that contain one of the search terms, with the
:: line number followed by colon as a prefix.
:: The FOR /F parses the results to get the line numbers.
:: The DO clause computes the begin and end values and iterates all values
:: in between so can echo to the find.txt file.
::
setlocal enableDelayedExpansion
>"%tempFile%" (
  for /f "delims=:" %%N in ('findstr /n "\<toto\> \<tata\>" "%input%"') do (
    set /a "beg=%%N-2, end=%%N+2"
    for /l %%N in (!beg! 1 !end!) do echo %%N:
  )
)
endlocal

:: The first FINDSTR prefixes each line with the line number followed by a colon.
:: The second FINDSTR excludes all the line numbers specified in find.txt.
:: The FOR /F parses the result and strips the line number prefix so can output
:: the final result.
::
>"%output%" (
  for /f "delims=: tokens=1*" %%A in (
    'findstr /n "^" "%input%" ^| findstr /vbig:"%tempFile%"'
  ) do @echo(%%B
)
del "%tempFile%"

Ниже приведен один вкладыш, использующий утилиту обработки текста с регулярными выражениями под названием JREPL. BAT . Это должно быть более надежным, поскольку распознает только tata или toto в элементе <Key>. Он также не заботится о том, где появляются новые строки.

jrepl "[\s\S]*<Key>(toto|tata)</Key>[\s\S]*" "" /m /p "<KeyValuePairs>[\s\S]*?</KeyValuePairs>\r?\n?" /f test.txt /o output.txt

Поскольку сам JREPL является пакетным скриптом, вам нужно будет использовать CALL JREPL, если вы поместите команду в пакетный скрипт.

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