使用find / replace with formula

时间:2014-10-27 13:17:37

标签: batch-file replace find formula

这很可能是一个非常简单的问题,但现在就去了。

我需要按特定顺序搜索文件中的数字,然后为每个数字添加5个/ 例如:

时间hr:1,st:2,ps:10(这就是我要寻找的 - 整个文件中会有各种其他数字)

我希望用+5替换数字

时间hr:6,st:7,ps:15

1 个答案:

答案 0 :(得分:0)

批处理不是文本处理的最佳选择,尤其是与您的要求一样复杂的东西。可以使用JScript,VBScript或PowerShell更简单地完成它。但是有可能批处理......

没有任何简单的批处理命令可以执行您想要的操作。您必须编写自己的代码来读取每一行,如果它与格式不匹配,请将其写出来。如果它与格式匹配,则解析该行以提取数字,使用SET / A递增它们,并写出新行。

您无法直接修改文件。相反,您必须写入临时文件。完成后,将临时文件移动到原始名称。

我将假设感兴趣的格式化文本未嵌入更大的行中。

您不会指示文件中的其他内容。空行和感叹号可能会导致问题。我假设它们可能存在,所以代码要比不需要的代码复杂得多。

我通过使用FINDSTR / N为每一行插入行号前缀来保护空行。在将该行写入新文件之前,必须先删除此前缀。

通过在循环内切换延迟扩展来保护感叹号。如果在扩展FOR变量时启用了延迟扩展,那么如果值包含感叹号,则该值将被破坏。

@echo off
setlocal disableDelayedExpansion
>"yourFile.txt.new" (
  for /f "delims=" %%L in ('findstr /n "^" "yourFile.txt"') do (
    for /f "delims=:, tokens=1-7*" %%A in ("%%L") do (
      if "%%B %%D %%F%%H" equ "time hr st ps" (
        set /a "hr=%%C+5, st=%%E+5, ps=%%G+5"
        setlocal enableDelayedExpansion
        echo time hr:!hr!,st:!st!,ps:!ps!
        endlocal
      ) else (
        set "ln=%%L"
        setlocal enableDelayedExpansion
        echo(!ln:*:=!
        endlocal
      )
    )
  )
)
::move /y "yourFile.txt.new" "yourFile.txt" >nul
type yourFile.txt.new