使用批处理文件在文本文件中查找值

时间:2014-06-04 10:55:08

标签: batch-file command-line

也许你可以帮助我们,这就是我想要做的事情。

我有一个看起来或多或少的文本文件:

  

别的东西

     blah blah blah

     

姓名:"价值&#34 ;; Param2:"价值&#34 ;; Param3:"值&#34 ;;

     

...

     

姓名:"价值&#34 ;; Param3:"价值&#34 ;; Param4:"价值&#34 ;; Param5:"值&#34 ;;

     

更多其他东西

我正在寻找以&#34开头的行;名称:"在该行中,我将对这些参数中的一个参数的价值感兴趣' (每次我运行它可能是一个不同的)。每行可能有不同数量的参数,可能不包含我搜索的那个。

因此,例如我要查找的参数是'宽度:'我需要来自具有该名称的所有行的值。我搜索的示例行可能看起来像这样

  

姓名:"测试&#34 ;;范围:" 32&#34 ;;颜色:" #FFFFF&#34 ;;宽度:" 11&#34 ;;不透明度:" 0.1&#34 ;;

我需要得到Width值,即11。

到目前为止,我已经设法提出了这个问题:

for /f "delims=" %%a in ('FIND "Name: " %1') do (
echo %%a
)

这会找到包含文件名称和值的每一行(如此文件之前提到的还包含其他一些我不需要的东西)并显然输出它。现在我不知道如何找到所需的参数以及如何获得它的值。我正在考虑用线条搜索参数(从示例中它将是宽度:",将其与之前的所有内容一起切割出来,然后搜索双引号并将其与所有后缀一起切割。这应该是只留下所需的价值。我无法做到这一点,因此我在这里寻求帮助。

1 个答案:

答案 0 :(得分:1)

您使用FIND并不能保证该行以Name:开头。

FINDSTR原语正则表达式功能可以验证该行以Name:开头,以及查找包含所需参数的行。

变量搜索和替换!var:*search=replace!可用于从行的开头通过所需的参数名称删除所有文本。

可以使用额外的FOR / F来解析剩余字符串的第一个标记。

for /f "delims=" %%A in (
  'findstr /rc:"^Name: .* Width: " %1'
) do (
  set "ln=%%A"
  setlocal enableDelayedExpansion
  for /f "delims=; " %%B in ("!ln:* Width: =!") do (
    endlocal
    echo %%~B
  )
)

存在一个潜在的问题 - 如果较早的参数值具有嵌入在值中的所需参数名称,则搜索和替换步骤可能会给出错误的结果。例如

Name: "value"; Comment: "I want the Width: value"; Width: "11"; etc...

任何提供复杂正则表达式搜索和替换功能的实用程序都可用于提供准确答案。例如,Windows的sed是免费提供的,它可以完成这项工作。

我写过REPL.BAT - a hybrid JScript/batch utility that performs a regex search and replace on stdin and writes the result to stdout。它是纯脚本,可​​以在任何现代Windows机器上从XP开始本地运行。完整的文档嵌入在脚本中。

REPL.BAT可以一步提供你的答案:)只要内容遵循你所规定的格式,它就应该始终有效。

type %1 | repl "^Name: \q.*?\q;( [^:]+: \q.*?\q)* Width: \q(.*?)\q;.*" $2 ax

如果需要,可以很容易地修改正则表达式以支持令牌之间的不同数量的空格。