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

Posted

技术标签:

【中文标题】如何在该行某处某处的某一行中的特定字符串之后从文本文件中获取一个数字?【英文标题】:How to get a number from a text file after a specific string in one of the lines somewhere on the line? 【发布时间】:2021-05-30 22:54:37 【问题描述】:

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

-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

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

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

【问题讨论】:

FINDSTR 不是像SED 这样的内联编辑器。如果您只需要数字,则需要使用FOR /F 命令捕获FINDSTR 命令的输出。 @Squashman 但是我们如何使用FOR /F 进行提取,因为-param 在文本文件中的位置可能会改变。我们必须首先检查我们正在读取的数字是否后跟 -param。 默认情况下,FOR /F 命令将按空格字符分割输出。然后使用TOKENS 选项获取每个号码。在您的情况下,您需要 TOKENS 4 和 6,因为它们是该行中的第 4 和第 6 个分隔项。 【参考方案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%"
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

内部 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%"
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

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

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

【讨论】:

【参考方案2】:

您使用了锚点 ^$ 来标记行的开始和行的结束(请参阅 findstr docs)。

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

我使用了额外的标志/c,所以你可以在模式中使用空格,它们不会被视为“或”运算符。

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

【讨论】:

但它给出的是完整的行而不是 -param 后面的数字。 @GauravSahu 无法提取部分字符串。它总是输出整行。

以上是关于如何在该行某处某处的某一行中的特定字符串之后从文本文件中获取一个数字?的主要内容,如果未能解决你的问题,请参考以下文章

在tmux中如何复制文本并粘贴到某处?

如何在 Python 中访问文件(.txt)中的下一行

在java中如何修改文本文件中的某一行的某些数据??

linux中的vim 编辑一行内容,如何使光标快速移动到行首和行尾以及行中间某处啊

在java中如何修改文本文件中的某一行的某些数据??

在 MS Access 2003 上出现错误 (3163)