Да, но это не очень красиво. Очевидным кандидатом для этого было бы регулярные выражения, которые у вас есть только для сопоставления (а затем только очень ограниченных) в пакетных файлах. Если вы хотите использовать PowerShell, то он бы просто
Get-Content foo.txt | ForEach-Object {
[Regex]::Match($_, 'NUM="(\d+)"').Groups[1].Value
}
Но, к сожалению, в пакетном файле это немного сложнее.
Вы можете, однако, использовать for /f
, чтобы проанализировать файл, а затем изучить маркеры. Однако нет простого способа разобрать маркер строки с помощью токена. И токенизация останавливается после 31 токена (если я правильно помню). В любом случае:
@echo off
for /f "delims=" %%f in (foo.txt) do call :parse "%%f"
goto :eof
:parse
setlocal enabledelayedexpansion
set i=0
:parseImpl
set /a i+=1
(
for /f "tokens=%i% delims= " %%l in (%1) do (
rem Jump out if no more tokens are there
if "%%l"=="" goto :eof
rem Remember the token
set T=%%l
if "!T:~0,4!"=="NUM=" (
set N=!T:~4!
rem add redirection here if needed
echo !N:"=!
)
)
) || goto :eof
rem This above will cause the loop to stop once no more tokens are there.
rem The for loop will return a non-zero exit code then.
goto parseImpl
Это не слишком красиво, но довольно просто. Так как при чтении файла я могу использовать каждую строку только один раз, когда я делегирую работу на подпрограмму, которая проходит по линии так часто, как это необходимо. Для этого используется переменная i
, которая отслеживает текущий токен. Затем используется другой цикл for
, который извлекает запрошенный токен из строки. Если токен начинается с NUM=
, то предполагается, что это номер, который вы хотите. Он очищается и печатается.
Если вы хотите их непосредственно в файл, а затем изменить соответствующую строку в
>out.txt echo !N:"=!
Код также можно найти in my SVN.
В чем вопрос? Что делать yopu из файла? Текст (как предполагает ваш предмет)? или числа, как предлагает ваш вопрос. Можете ли вы привести примерный вывод, соответствующий вашему примеру? – 2010-12-06 15:35:43
Спасибо Paul.I нужно извлечь цифры и записать их в новый файл. – 2010-12-06 15:37:40
Выходной файл должен содержать «100», «102», «103» – 2010-12-06 15:43:51