我的文本文件包含类似模式的一系列数字:
<Lorepsum ipsum lores aus Lorep NUM="100" aus Lore>
<Lorepsum ipsum lores aus Lorpsum NUM="101" Lorepsum>
<Lorepsum ipsum lores aus Lorp77dsum NUM="102" ipsum lores aus>
<Lorepsum ipsum lores aus Lopsum NUM="103" lores aus>
是否可以编写Windows批处理脚本来从文件中提取数字并将其放入新文件中?
o / p文件应包含
101
102
103
104
答案 0 :(得分:1)
是的,但不是很漂亮。对此明显的选择是b正则表达式,您只需要在批处理文件中进行匹配(然后只是非常有限)。如果您使用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。
答案 1 :(得分:-1)
这应该让你开始:
@echo off
set cnt=0
set max=9
:enter_loop
if %cnt% GTR %max% goto end_loop
echo NUM="%cnt%" >> output.txt
set /a cnt="cnt+1"
goto enter_loop
:end_loop
pause