首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用批处理或powershell仅获取清单中的第一个数字序列

如何使用批处理或powershell仅获取清单中的第一个数字序列
EN

Stack Overflow用户
提问于 2019-10-28 00:17:40
回答 3查看 136关注 0票数 0

我需要的是列表中数字的第一个序列:

命令:

代码语言:javascript
复制
for /f "delims=" %%a in (notas.txt) do @echo %%a

返回:

代码语言:javascript
复制
Compra cfme NF 12345 de 123 CIA ABC
Pgto dupl. 12345 - 123 CIA ABC
Compra cfme NFS 654321-CIA CBC
Pgto NF 654321 de CIA CBC

但我需要的是:

代码语言:javascript
复制
12345
12345
654321
654321

提前感谢

EN

回答 3

Stack Overflow用户

发布于 2019-10-28 00:34:16

有许多PowerShell解决方案/技术可以执行所需的任务。

switch语句可以与-File-Regex参数一起使用。

代码语言:javascript
复制
switch -Regex -File notas.txt {
  '\d+' { $Matches[0] }
}

您还可以使用regex类中的Match方法:

代码语言:javascript
复制
Get-Content notas.txt | Foreach-Object {
    [regex]::Match($_,'\d+').Value
}

这两种解决方案都依赖于正则表达式匹配,其中\d+匹配一个或多个连续的数字。因为我们每行只进行一次匹配,所以第一个匹配是唯一返回的匹配。正则表达式类方法Matches为每个字符串输入返回多个匹配项。

票数 3
EN

Stack Overflow用户

发布于 2019-10-28 02:50:54

对于在VBScript中使用正则表达式的批处理文件,您可以执行如下操作:Demo Here

代码语言:javascript
复制
@echo off & color 0A
Title Extract Numbers from String using Regex with vbscript
Set "InputFile=%~dp0notas.txt"
Set "OutPutFile=%~n0_OutPutFile.txt"
Call :Extract_Number "%InputFile%" CON
Call :Extract_Number "%InputFile%" "%OutPutFile%"
TimeOut /T 3 /NoBreak>nul 
If Exist "%OutPutFile%" Start "" "%OutPutFile%" & Exit
::-----------------------------------------------------------------------------------
:Extract_Number <Input> <OutPut>
(
echo WScript.StdOut.WriteLine Extract_Number(Data^)
echo Function Extract_Number(Data^)
echo      Data = "%~1" 
echo      Data = WScript.StdIn.ReadAll 
echo      Set re = New RegExp 
echo      re.Global = True 
echo      re.IgnoreCase = True  
echo      re.Pattern = "\d{5,}" 
echo      For Each Match in re.Execute(Data^) 
echo          Number = Number ^& Match.Value ^& vbCrLF
echo      Next  
echo     Extract_Number = Number
echo End Function
)>"%tmp%\%~n0.vbs"
cscript //nologo "%tmp%\%~n0.vbs" < "%~1" > "%~2"
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
Exit /B
::----------------------------------------------------------------------------------
票数 0
EN

Stack Overflow用户

发布于 2019-10-28 06:20:20

第一个代码做了您的问题所要求的,但不是您预期的结果:

代码语言:javascript
复制
@echo off

:: Pass the entire line to a subroutine
for /f "delims=" %%a in (notas.txt) do call :process %%a

goto :eof


:process
:: Check if we've evaluated the entire line
if "%1"=="" (
   echo No number was found in this line
   goto :eof
)

:: Check if the current parameter is only numbers
:: If it is, then echo and move on to the next line
:: If not, use shift to evaluate the next parameter
echo %1|findstr /i /r "[^0-9]" >nul && shift && goto :process
echo %1
goto :eof

两件事。首先,如果在行中找不到数字,我不知道你想要做什么。在上面的代码中,我只是回显了“在这一行没有找到数字”。

其次,我假定“数字”完全由标准空格作为分隔符。因此,上面的代码不会从Compra cfme NFS 654321-CIA CBC行返回654321,因为654321-CIA不是由空格分隔的数字。如果需要其他分隔符,请更改上面的行:

代码语言:javascript
复制
for /f "delims=" %%a in (notas.txt) do call :process %%a

至:

代码语言:javascript
复制
for /f "tokens=1-10 delims=-., " %%a in (notas.txt) do call :process %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j

添加您想要的任何分隔符(不要忘记双引号前的空格)。在给定行上,此行最多支持10个条目。通过%%z使用tokens=1-26%%a到26是相当容易的。

最后--如果你想拉取一个无分隔符的数字--那将是一种完全不同的方法。一个例子是从PC1356 NLA LOA获取1356;或者从PC LI-D 35232NDA TTH获取35232

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58581176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档