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

问题描述 投票:0回答:2

我有一个文本文件,其中包含以下两行:

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

我想获取与

-param
对应的值,即 Windows 批处理文件中的
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

regex windows batch-file scripting
2个回答
1
投票

这里是一个示例代码,说明如何处理并非真正的故障安全,但希望足以满足您的目的,从文本文件读取的行以获取众所周知的参数字符串(如

-param
)之后的下一个参数字符串。

@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%"
exit /B

: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"
exit /B

:HaveValue
rem Output the parameter value as an example for further command lines.
set ParamValue

endlocal

外部 FOR 循环从文本文件中逐个读取非空行,并将每一行完全分配给指定的循环变量

I

内部 FOR 循环处理当前行,类似于

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

上面的扩展版本首先获取

-param
之后的字符串,如示例中的
3
所示。然后,再次在整个文本文件中搜索以
-param
开头的参数字符串以及首先从示例中的文件中读取的附加字符串
-param3
。如果找到该字符串,则将下一个字符串分配给环境变量
ParaValue
,在示例中为
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%"
exit /B

: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"
exit /B

: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%"
exit /B

:HaveValue
rem Output the parameter value as an example for further command lines.
set ParamValue

endlocal

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • call /?
    ... 解释
    %~dp0
    ... 批处理文件路径始终以反斜杠结尾。
  • echo /?
  • endlocal /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?

1
投票

您使用了锚点

^
$
来标记行的开头和行的结尾(请参阅 findstr 文档)。

正确的模式是:

findstr /r /c:"-param [0-9]*"

我使用了附加标志

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

模式很简单:首先从字面上匹配

-param 
,然后用
[0-9]*

匹配零个或多个数字
© www.soinside.com 2019 - 2024. All rights reserved.