微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从文本文件中某行某行中的特定字符串之后获取数字?

如何解决如何从文本文件中某行某行中的特定字符串之后获取数字?

我有一个包含以下两行的文本文件

-host MYPC -param 3 -param2 4
-host MYPC -param3 2 -param4 5

我想在 Windows 批处理文件获取-param 对应的值,即 3 (-param 3)。

我使用 findstr 命令进行了尝试,如下所示:

findstr /R "^-param$" > step1_a.txt my_file.txt

但它输出这个:

FINDSTR: /c ignored
FINDSTR: /A ignored
FINDSTR: /f ignored
FINDSTR: /f ignored
FINDSTR: /t ignored
FINDSTR: /y ignored
FINDSTR: /a ignored
FINDSTR: /k ignored

我认为,这是由字符串中的 - 引起的。

如何在我的文本文件获取3 关联的值 -param

解决方法

您使用了锚点 ^$,它们标记了一行的开始和一行的结尾(参见 findstr docs)。

正确的模式应该是:findstr /r /c:"-param [0-9]*"

我使用了额外的标志 /c,因此您可以在模式内使用空格,并且它们不会被视为“或”运算符。

模式很简单:首先从字面上匹配 -param ,然后用 [0-9]* 匹配零个或多个数字

,

这里是一个示例代码,说明如何处理不是真正的故障安全,但希望足以满足您的目的,从文本文件中读取的行在众所周知的参数字符串之后获取下一个参数字符串,例如 {{1} }.

-param

外部 FOR 循环从文本文件中逐行读取非空行,并将每一行完全分配给指定的循环变量 @echo off setlocal EnableExtensions DisableDelayedExpansion set "DataFile=%~dp0my_file.txt" rem Does the input data file exist? if exist "%DataFile%" goto ProcessData rem Input data file not found in directory of the batch file. echo ERROR: Could not find file: "%DataFile%" goto :EOF :ProcessData set "ParamValue=" for /F usebackq^ delims^=^ eol^= %%I in ("%DataFile%") do for %%J in (%%I) do ( if not defined ParamValue ( if /I "%%~J" == "-param" set "ParamValue=1" ) else (set "ParamValue=%%~J" & goto HaveValue) ) rem The parameter of interest was not found at all or there is no value. echo ERROR: Could not find the parameter with name: "-param" goto :EOF :HaveValue rem Output the parameter value as an example for further command lines. set ParamValue endlocal

内部 FOR 循环处理当前行的方式类似于 I 处理传递给批处理文件的参数字符串的方式。所有空格/制表符/逗号/分号/等号/不间断空格(在 OEM 编码中)分隔的字符串都将被忽略,直到找到不区分大小写的字符串等于字符串 cmd.exe。当前行中的下一个字符串被分配给环境变量 -param,并使用命令 GOTO 退出两个循环,以在标签 {{1} 下方的行上继续批处理文件} 其中环境变量 ParamValue 可用于任何目的。

上面的这个扩展版本首先获取 :HaveValue 之后的字符串,它在示例 ParamValue 中。然后在整个文本文件中再次搜索以 -param 开头的参数字符串和附加的字符串,该字符串首先从示例中的文件 3 中读取。如果找到此字符串,则将下一个字符串分配给环境变量 -param,在示例中为 -param3

ParaValue

要了解使用的命令及其工作原理,请打开 command prompt 窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • 2 ... 解释了 @echo off set "DataFile=%~dp0my_file.txt" rem Does the input data file exist? if exist "%DataFile%" goto ProcessData rem Input data file not found in directory of the batch file. echo ERROR: Could not find file: "%DataFile%" goto :EOF :ProcessData set "ParamName=" for /F usebackq^ delims^=^ eol^= %%I in ("%DataFile%") do for %%J in (%%I) do ( if not defined ParamName ( if /I "%%~J" == "-param" set "ParamName=1" ) else (set "ParamName=-param%%~J" & goto HaveName) ) rem The parameter of interest was not found at all or there is no value. echo ERROR: Could not find the parameter with name: "-param" goto :EOF :HaveName set "ParamValue=" for /F usebackq^ delims^=^ eol^= %%I in ("%DataFile%") do for %%J in (%%I) do ( if not defined ParamValue ( if /I "%%~J" == "%ParamName%" set "ParamValue=1" ) else (set "ParamValue=%%~J" & goto HaveValue) ) rem The parameter of interest was not found at all or there is no value. echo ERROR: Could not find the parameter with name: "%ParamName%" goto :EOF :HaveValue rem Output the parameter value as an example for further command lines. set ParamValue endlocal ... 批处理文件路径总是以反斜杠结尾。
  • call /?
  • %~dp0
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。