Как извлечь слово после конкретного символа в пакетной программе? - PullRequest
0 голосов
/ 10 октября 2019

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

Item1 $23 Item2 $24
Item3 $25

Когда я запускаю этот скрипт:

@echo off
for /f "delims=$ tokens=1*" %%A in (test.txt) do echo %%B >> result.txt

Результатэто:

23 Item2 $24
25

Я хочу получить результат:

23
24
25

Как восстановить скрипт?

Ответы [ 4 ]

1 голос
/ 10 октября 2019

Попробуйте следующий скрипт (см. Пояснительные rem замечания в коде):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_IFILE=test.txt"
set "_OFILE=result.txt"

rem // Store line-break in variable:
(set ^"LF=^
%= blank line =%
^")

rem // Write to resulting file:
> "%_OFILE%" (
    rem // Loop through lines of text file:
    for /F "usebackq delims=" %%L in ("%_IFILE%") do (
        rem // Store current line in variable:
        set "LINE=%%L"
        rem // Toggle delayed expansion to be able to write and read variable in same code block:
        setlocal EnableDelayedExpansion
        rem // Replace each `$` by line-break and loop over resulting lines skipping the first one:
        for /F "skip=1" %%K in (^"!LINE:$^=^%LF%%LF%!^") do (
            rem // Return first token of each line:
            echo(%%K
        )
        endlocal
    )
)

endlocal
exit /B

Сначала каждый $ заменяется на разрыв строки, поэтому первая строка test.txt становится:

Item1 
23 Item2 
24

И второе становится:

Item3
25

Затем извлекается первое ПРОБЕЛ - или TAB - токен, отделенный от каждой из вновь сформированных многострочных строк, пропускается первая строка, поэтому возвращаются только цифры.

0 голосов
/ 10 октября 2019

Я решил опубликовать этот пример , чтобы показать метод анализа каждой строки и возврата каждой другой строки, (не работает с символами-ядами) .

@(For /F "UseBackQDelims=" %%A In ("test.txt")Do @(Set "i=0"
    For %%B In (%%A)Do @(Set /A "i=(i+1)%%2"&Cmd /V:On /Q /C Exit !i!
        If Not ErrorLevel 1 Echo %%B)))>"results.txt" 

В приведенном вами примере кода и "требуемом" результате вы, вероятно, могли бы использовать эту идею для вывода строк с удаленным первым символом, если это $ .

@(For /F "UseBackQDelims=" %%A In ("test.txt")Do @(Set "i=0"
    For %%B In (%%A)Do @(Set /A "i=(i+1)%%2"&SetLocal EnableDelayedExpansion
        If !i! Equ 0 (Set "Val=%%B"&If "!Val:~,1!"=="$" (Echo !Val:~1!
            )Else Echo %%B)&EndLocal)))>"results.txt"
0 голосов
/ 10 октября 2019

Это должно делать именно то, что вы хотите.

@echo off
setlocal enabledelayedexpansion
(for /f "usebackq tokens=* delims= " %%i in ("test.txt") do (
    set "_br=%%i"
    echo(!_br: =^

!
  )
)>_tmp
(for /f "delims=$ tokens=*" %%a in ('type _tmp ^| find "$"') do echo %%a)>result.txt

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

    echo(!_br: =^

!

ThisСкрипт просто разделяет каждое слово, разделенное пробелом, и перенаправляет его в новый файл, затем мы специально ищем слова, содержащие $, и перенаправляем только эти совпадения.

0 голосов
/ 10 октября 2019
@echo off
setlocal EnableExtensions EnableDelayedExpansion

for /f "delims=" %%A in (test.txt) do (
 for %%T in (%%A) do (
  set "term=%%T"
  if "!term:~0,1!"=="$" echo !term:~1!
 )
)>> result.txt
endlocal

Читайте каждую строку в %%A. Токениз на %%T. Присвойте каждому токену по очереди term, проверьте первый символ и, если $, echo термин, кроме первого символа.

...