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

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

Исходное имя файла: test1.txt

Внутри файла замените следующие две строки именем файла (внутри каждого файла нижеприведенные строки могут быть не справа друг от друга):

location000:/computer/[project]/name/123.php,32,1,2,512,0,,txt
newlocation000:/computer/[project]/name/123.php,32,1,2,512,0,,txt

Вывод в файл test1.txt

location000:/computer/[project]/name/test1.php,32,1,2,512,0,,txt
newlocation000:/computer/[project]/name/test1.php,32,1,2,512,0,,txt

1 Ответ

0 голосов
/ 31 октября 2018

Это легко достижимая задача с использованием JREPL.BAT , написанного Дейвом Бенхамом , который представляет собой гибрид пакетного файла / JScript для выполнения замены регулярного выражения в файле с использованием JScript. .

@echo off
if not exist "%~dp0jrepl.bat" (
    echo ERROR: JREPL.BAT missing in directory "%~dp0".
    echo/
    pause
    goto :EOF
)

for %%I in ("C:\Temp\*.txt") do call "%~dp0jrepl.bat" "^((?:new)?location000:/.+/).*(\.[^.,]+,)" "$1%%~nI$2" /F "%%I" /O -

Этот пакетный файл работает только на дисках NTFS. Это может привести к бесконечному циклу выполнения на дисках FAT16, FAT32 или ExFAT или пропуску некоторых текстовых файлов. Для рабочего решения, независимого от файловой системы, замените последнюю командную строку на:

for /F "eol=| delims=" %%I in ('dir "C:\Temp\*.txt" /A-D-H /B /ON 2^>nul') do call "%~dp0jrepl.bat" "^((?:new)?location000:/.+/).*(\.[^.,]+,)" "$1%%~nI$2" /F "C:\Temp\%%I" /O -

Пакетный файл JREPL.BAT должен храниться в том же каталоге, что и пакетный файл с кодом выше. По этой причине пакетный файл сначала проверяет, действительно ли JREPL.BAT существует в каталоге пакетного файла, и, если это не так, выдает сообщение об ошибке, останавливает выполнение скрипта, чтобы пользователь мог прочитайте это сообщение об ошибке и затем выйдите. См. Куда возвращается GOTO: EOF?

Команда FOR ищет в указанном каталоге C:\Temp нескрытые файлы, соответствующие шаблону подстановки *.txt, и вызывает для каждого найденного текстового файла пакетный файл JREPL.BAT для замените имя файла между last / и first строкой, начинающейся с ., с одним или несколькими символами, не являющимися точкой или запятой, со следующим символом, являющимся , (= расширение файла и запятая) в строках, начинающихся с чувствительности к регистру location000:/ или newlocation000:/ по имени текущего файла * .txt без расширения файла. Таким образом, имя файла в существующем файле может содержать также один или несколько . в имени файла перед расширением файла.

Решение, работающее также на дисках FAT, использует команду DIR для получения захваченного списка * .txt файлов с просто именем файла и расширением файла без пути и FOR обрабатывает этот список имен файлов построчно, т.е. имя файла по имени файла. Таким образом, список * .txt файлов для обработки не изменяется при запуске FOR , вызывающем JREPL.BAT , как это было бы в случае использования FOR непосредственно для поиска файлы * .txt на дисках FAT.

NTFS возвращает список записей каталога, соответствующих шаблону подстановочного знака, отсортированному в алфавитном порядке, поэтому список файлов * .txt не изменяется во время итераций FOR в этом случае. Но все файловые системы FAT возвращают список записей каталога, соответствующих шаблону с подстановочными знаками, в соответствии с последней модификацией в каталоге с последним измененным файлом в конце списка. Таким образом, в то время как FOR получает одно имя файла за другим при использовании for %%I in ("C:\Temp\*.txt") do из файловой системы и обрабатывает файл с вызовом jrepl.bat, который изменяет файл, список файлов изменяется на дисках FAT и возвращается следующая запись каталога в FOR при поиске *.txt это либо только что измененный файл (= бесконечный цикл), либо другой файл после пропуска файла, который также должен быть изменен из-за изменения списка файлов с момента последнего доступа к каталогу FOR .

Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.

  • call /? ... объясняет также %~dp0 ... диск и путь аргумента 0, являющийся самим пакетным файлом.
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • jrepl.bat /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...