Как получить подстроку от реверса до определенного символа, используя пакетный скрипт - PullRequest
0 голосов
/ 18 мая 2018

У меня есть эти строки в виде списка имен файлов

abc-cdef-ijklm-2018.04.02-vendor1.1.0.0
abc-cdef-pqrs-2018.03.22-writer1.2.0.0
abc-cdef-lmno-2017.03.22-reader22.5.0.5

Мне нужно извлечь эти подстроки из каждой строки, которая обратная после последних 5 букв до тире -.

vendor1
writer1
reader22

Как это сделать с помощью простого пакетного сценария.

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Есть несколько способов решить эту проблему.Это очень просто:

@echo off
setlocal

rem Process the strings (from test.txt file)
for /F "delims=" %%a in (test.txt) do call :extract "%%a"
goto :EOF


:extract

REM ECHO ON

set "string=%~1"

rem Extract *the last part* after the last dash
set "string=%string:-=" & set "string=%"

rem Extract *the first part* before the first dot
set "string=%string:.=" & rem "%"

@REM ECHO OFF

echo %string%
exit /B

Например, если это входной файл test.txt :

abc-cdef-ijklm-2018.04.02-vendor1.1.0.0
abc-cdef-pqrs-2018.03.22-writer1.2.0.0
abc-cdef-lmno-2017.03.22-reader22.5.0.5

Это вывод:

vendor1
writer1
reader22

Этот метод использует простую подстроку подстановки для выполнения извлечения нужных частей.Намного проще просмотреть метод, а не объяснить его, так что вы можете активировать команды ECHO ON и @ECHO OFF и самостоятельно проверить, как работает метод.

Если вам нужно дополнительное объяснение, см. в этой теме .

0 голосов
/ 18 мая 2018

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

скажем, ваши файлы имеют расширение .PEM, тогда мы можем сделать:

@echo off
for /f "tokens=1-10 delims=-." %%a in ('dir /b *.PEM') do echo %%g

Если у вас есть список имен файлов в файле, назовем его file.txt, где содержимое выглядит так:

abc-cdef-ijklm-2018.04.02-vendor1.1.0.0
abc-cdef-pqrs-2018.03.22-writer1.2.0.0
abc-cdef-lmno-2017.03.22-reader22.5.0.5

Тогда этот код должен сделать:

@echo off
for /f "tokens=1-10 delims=-." %%a in ('type file.txt') do echo %%g

Но, если вы укажете, как вы будете обращаться к именам файлов, я могу изменить свой ответ.

0 голосов
/ 18 мая 2018

Для извлечения последнего элемента, ограниченного -, вы можете использовать стандартный цикл for, как в подходе ниже.Хитрость заключается в замене каждого - стандартным разделителем, таким как SPACE , и заключением каждой части между "", чтобы защитить все остальные встречающиеся разделители.Итак, вот соответствующий код:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_FILE=%~1" & rem // (use first command line argument)

rem // Read file line by line (empty lines are ignored):
for /F usebackq^ delims^=^ eol^= %%L in ("%_FILE%") do (
    rem // Store line string:
    set "LINE=%%L"
    setlocal EnableDelayedExpansion
    rem /* Enclose line string within `""` and replace every `-` by `" "`,
    rem    which results in several space-delimited items within `""`: */
    for %%I in ("!LINE:-=" "!") do (
        endlocal
        rem // Store (overwrite) current item with surrounding `""` removed:
        set "ITEM=%%~I"
        setlocal EnableDelayedExpansion
    )
    rem // Splif off first `.` and everything after from last item:
    for /F "tokens=1 delims=. eol=." %%V in ("!ITEM!") do (
        endlocal
        rem // Return extracted string portion:
        echo(%%V
        setlocal EnableDelayedExpansion
    )
    endlocal
)

endlocal
exit /B

Этот скрипт завершается ошибкой, если текстовый файл содержит символы *, ?, <, > и ".

Учитывая, что скрипт называется data-extract.bat, строки для обработки хранятся в текстовом файле с именем data.txt, и обе они помещаются в текущую директорию, запустите скрипт так:

data-extract.bat "data.txt"

Чтобы сохранить вывод в другом файле (отличном от data.txt!), Используйте это:

data-extract.bat "data.txt" > "data_NEW.txt"
0 голосов
/ 18 мая 2018

Если число подстрок, разделенных -, является константой пять, в пакетном файле можно использовать следующий код:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_FileName1=abc-cdef-ijklm-2018.04.02-vendor1.1.0.0"
set "_FileName2=abc-cdef-pqrs-2018.03.22-writer1.2.0.0"
set "_FileName3=abc-cdef-lmno-2017.03.22-reader22.5.0.5"

for /F "tokens=1* delims==" %%A in ('set _FileName') do (
    for /F "eol=| tokens=5 delims=-" %%C in ("%%B") do (
        for /F "eol=| delims=." %%D in ("%%C") do (
            echo Last part of "%%B" is: %%D
        )
    )
)
endlocal
pause

Пожалуйста, игнорируйте самый внешний цикл FOR , используемый здесьтолько для обработки значений неопределенного числа переменных среды, имя которых начинается с _FileName.

Второй цикл FOR обрабатывает имя файла, назначенное переменной цикла B вв этом случае путем разбиения его на подстроки (токены) с использованием - в качестве разделителей, как указано в delims=-.

Интерес представляет только пятая подстрока.Поэтому tokens=5 указывает, что только пятая подстрока должна быть назначена указанной переменной цикла A.

Кроме того, символ конца строки изменяется со значения по умолчанию ; на |, чтобы избежать начала имени файлас точкой с запятой полностью игнорируется FOR .Имя файла не может иметь вертикальную черту в имени.

Таким образом, второй цикл FOR присваивает переменной цикла C строки:

vendor1.1.0.0
writer1.2.0.0
reader22.5.0.5

Третий цикл FOR используется для удаления всего после первой точки путем разделения этой строки на подстроки с использованием . в качестве разделителя с назначением только первой подстроки указанной переменной цикла D, как по умолчанию с опцией tokens=не указано явноСнова eol=| используется, чтобы избежать того, что строка полностью игнорируется FOR , если эта строка начинается с точки с запятой.

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

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

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_FileName1=abc-cdef-ijklm-2018.04.02-vendor1.1.0.0"
set "_FileName2=abc-pqrs-2018.03.22-writer1.2.0.0"
set "_FileName3=lmno-2017.03.22-reader22.5.0.5"
goto ProcessFileNames


:LastPart
set "FileName=%~1"
rem Get file name without the last six characters.
set "FileName=%FileName:~0,-6%"

rem Remove from file name in a loop everything from beginning to first hyphen
rem character with removing also the hyphen until this is not possible anymore
rem because of file name string not containing anymore a hyphen.

:LastHyphen
set "LastPart=%FileName:*-=%"
if not "%LastPart%" == "%FileName%" set "FileName=%LastPart%" & goto LastHyphen

echo Last part of %1 is: %LastPart%

rem Exit subroutine LastPart and return to calling FOR command line.
goto :EOF


:ProcessFileNames
for /F "tokens=1* delims==" %%A in ('set _FileName') do call :LastPart "%%B"
endlocal

И, наконец, еще один вариант выше, в котором число символов в конце каждого имени файла также может быть переменной.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_FileName1=abc-cdef-ijklm-2018.04.02-vendor1.1.0.0"
set "_FileName2=abc-pqrs-2018.03.22-writer1.2.0.50"
set "_FileName3=lmno-2017.03.22-reader22.5.10.15"
goto ProcessFileNames


:LastPart
set "FileName=%~1"

rem Remove from file name in a loop everything from beginning to first hyphen
rem character with removing also the hyphen until this is not possible anymore
rem because of file name string not containing anymore a hyphen.

:LastHyphen
set "LastPart=%FileName:*-=%"
if not "%LastPart%" == "%FileName%" set "FileName=%LastPart%" & goto LastHyphen

rem Get string up to first dot from last part of file name.
for /F "eol=| delims=." %%I in ("%LastPart%") do set "LastPart=%%I"

echo Last part of %1 is: %LastPart%

rem Exit subroutine LastPart and return to calling FOR command line.
goto :EOF


:ProcessFileNames
for /F "tokens=1* delims==" %%A in ('set _FileName') do call :LastPart "%%B"
endlocal

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

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • rem /?
  • set /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...