Удаление текстовых строк сверху или включающих определенный символ или строку из нескольких текстовых файлов - PullRequest
1 голос
/ 10 января 2012

У меня есть текстовые файлы текстов песен в том же каталоге, из которого я хотел бы удалить несколько строк в соответствии с этими правилами:

A.удалить все строки, содержащие квадратные скобки []

B.уберите три непустые строки сверху.

C.удалите две непустые строки снизу.

Например, может быть, командная строка, подобная этой, будет зафиксирована в do (A) для нескольких файлов?

type *.txt | findstr /v LYRICS | findstr /v "[" | findstr /v "]" >*.txt

Гилберт

1 Ответ

1 голос
/ 10 января 2012

Major Edit - я тестировал и отлаживал свой код.Было много ошибок.

Я думаю, это должно вас сблизить.Но я все еще не уверен, что понимаю ваше непустое условие.

Этот код изменит все файлы .TXT в текущем каталоге.Для каждого файла следует удалить первые 3 строки, последние 2 строки и все строки, содержащие [или].Любая строка, начинающаяся с: в 1-й позиции, будет иметь ведущее значение: stripped.

@echo off
for %%F in (*.txt) do (
  for /f %%N in ('find /c /v "" ^<"%%F"') do set bottom1=%%N
  set /a bottom2=bottom1-1
  (
    for /f "tokens=1* delims=:" %%A in (
      'findstr /n "^" "%%F" ^| findstr /vr /c:"\[" /c:"\]" /c:"^1:" /c:"^2:" /c:"^3:" /c:"^%%bottom1%%:" /c:"^%%bottom2%%:"'
    ) do echo(%%B
  )>"%%~nF.mod"
  rem del "%%F"
  rem ren "%%~nF.mod" "%%~nxF"
)

Как написано, исходный файл будет сохранен, а измененная версия будет иметь то же имя, но с расширением .mod.

Если результаты вас устраивают, вы можете удалить rem с передней части последних 2 строк, и тогда ваши исходные файлы будут перезаписаны измененной версией.Если вы сделаете это изменение, убедитесь, что вы запускаете скрипт только один раз!

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

Интересным является большая длинная команда во втором цикле FOR.Первый FINDSTR префикс каждой строки с номером строки.Эти результаты затем передаются на второй FINDSTR, который удаляет соответствующие строки, основываясь на моем понимании ваших требований.

Он использует регулярные выражения.Например, «^ 1:» - это регулярное выражение, которое ищет «1:» в начале строки.

Двойные проценты используются для bottom1 и bottom2, чтобы мы могли получить доступ к текущим значениям без использования отложенного расширения.В родительском пакете %% bottom1 %% становится% bottom1%, который передается команде FINDSTR.Команды предложения FOR / F IN () выполняются в рамках их собственного сеанса CMD, поэтому он может правильно расширить текущее значение% bottom1%.

Поскольку используется параметр / v, FINDSTR сохраняет все строки, которыеНЕ соответствует ни одной из строк поиска регулярных выражений.Вы были на правильном пути в этом отношении.Просто эффективнее выполнять всю фильтрацию с помощью одного FINDSTR.

Параметры FOR / F устанавливаются для разбиения каждой строки на два токена с разрывом 1-го: в каждой строке.Только 2-й жетон напечатан.Вот как префикс номера строки удаляется из вывода.

...