windows - 如何将 findstr 与换行符正则表达式一起使用

标签 windows regex dos findstr

我正在使用 Windows dos 提示符。我有日志文件,其中包含如下日志:

Timestamp: Order received for Item No. 26551
Timestamp: Exception: OutOfRangeException
Timestamp: Message: Inventory Item is not stock. Item No. 23423
Timestamp: Order received for Item No. 23341

我想提取所有出现某种异常的项目编号。我为此使用 findstr 命令。如何在正则表达式中使用换行符?我想要所有具有异常字样的行以及从下一行开始的项目编号。

有什么帮助吗?

最佳答案

我发现了一个未记录的功能 - FINDSTR CAN 匹配换行符 <CR><LF>并在后续行中继续匹配。但搜索字符串必须在命令行上指定,换行符必须在变量中,并且值必须通过延迟扩展传递。

另一个复杂之处是 FOR 循环的 IN() 子句在单独的隐式 CMD session 中执行,并且必须重新启用延迟扩展。另外,!必须对字符进行转义,以便它们能够进入第二个 CMD session 。

这个小测试脚本就可以解决问题。

@echo off
setlocal enableDelayedExpansion
if "%~1"==":doSearch" goto :doSearch

::Define a variable as a LineFeed (0x0A) character
set LF=^


:: The above 2 blank lines MUST be preserved!

::Define a CR variable as a CarriageReturn (0x0D) character
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

set file="test.txt"
for /f "delims=" %%A in ('cmd /v:on /c^"findstr /rc:"Item No\. .*^!CR^!*^!LF^!.* Exception: " %file%^"') do (
  set "ln=%%A"
  set "item=!ln:*Item No. =!"
  echo Item No. !item! had an exception
)
exit /b


编辑 2015-01-11

我刚刚重读了这个问题,发现我错了。 OP想要异常字符串出现在前一行的项目编号(后向搜索),但我的解决方案只能找到异常出现在后一行的项目编号(前瞻搜索)。

不幸的是,没有办法让 FINDSTR 进行搜索后面的查看。

在大多数情况下,我会删除上面的答案,因为它没有回答问题。然而,这个答案确实记录了一个以前没有描述过的新颖的 FINDSTR 功能,该功能可能非常有用。前瞻功能在概念上与后视功能足够接近,需要它的人可能会通过这个问题找到答案,所以我打算保留它。

我确实有一个纯粹基于脚本的解决方案,可以在 XP 及以上的任何 Windows 计算机上运行,​​但它不使用 FINDSTR。 JREPL.BAT是一个正则表达式命令行,可以轻松提取所需的项目编号。

jrepl "Item No\. (\d+)\r\n.* Exception: " $1 /m /jmatch /f test.txt

关于windows - 如何将 findstr 与换行符正则表达式一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5631752/

相关文章:

windows - 无法在 Windows 7 上查询代理 "Automatically Detect Settings"

windows - 我如何知道 Windows 转储文件的类型?

cmd - 如果不存在,则退出+ cmd

c - 使用 djgpp 在 DOS 中等待——忙等待的替代方案?

string - BATCH CMD - 读取具有特殊字符的 INI 文件

c# - 使用C#隐藏任务栏

windows - MvvmCross 删除返回堆栈窗口应用程序

c# - 正则表达式 - 文件名中的版本

动态 URL 目标设置的正则表达式

php - 正则表达式匹配第一个单词与最后一个单词相同