0

所以我有一个用这种格式填写的文本文件

Identifier: NUMBER1
    Information1 = something
    Information2 = other something
    Information3 = more something

Indentified: NUMBER2
    Information1 = something
    Information2 = other something
    Information3 = more something

我试过使用 findstr 但与 grep 不同,它不能给我上下文。

如何获取上下文行以便我可以搜索其他信息?

如果可以的话,我会为 Windows 安装 grep 和 awk 等,但这是一个面向其他人的工具,所以我只能使用操作系统原生的东西,在这种情况下是批处理和 VBS。

我想做的等效unix表达式如下:

grep -A 4 "NUMBER1" file | grep "Information2" | awk ' { print $3 } ' #not sure if $3 or $2 off the top of my head
4

4 回答 4

2

您可以在 VBScript 中执行以下操作:

If WScript.Arguments.Count <> 2 Then
  WScript.Echo "Usage: " & WScript.ScriptName & " pattern filename"
  WScript.Quit 1
End If

Const Context = 3 'lines

Set fso = CreateObject("Scripting.FileSystemObject")

Set re = New RegExp
re.Pattern = WScript.Arguments(0)

n = 0
Set f = fso.OpenTextFile(WScript.Arguments(1))
Do Until f.AtEndOfStream
  line = f.ReadLine
  If re.Test(line) Then
    WScript.Echo line
    n = Context
  ElseIf n > 0 Then
    WScript.Echo line
    n = n - 1
  End If
Loop
f.Close

然而,这只是一个非常基本的草案,还有很大的改进空间(例如,将上下文行数作为参数,添加前上下文等)。

于 2013-08-01T22:14:08.437 回答
1

尝试这个:

@ECHO off&SETLOCAL
FOR /f "delims=:" %%a IN ('findstr /n "NUMBER1" file') DO SET "skip=%%a"
FOR /f "tokens=2*" %%b IN ('more +%skip% file ^| findstr "Information2"') DO IF NOT DEFINED line SET "line=%%c"
ECHO %line%

另见findstr /?

于 2013-08-01T22:00:56.763 回答
0

除非您使用的是相当旧的系统,否则您可能已经安装了 Windows 。使用 Powershell,您可以执行类似于 grep 的操作,如下所示:

Get-Content <filename> | Where-Object {$_ -like "*<pattern>*"}
于 2013-08-01T22:05:54.560 回答
0

您可以使用一个相当有用的类似 grep 的工具,它是一个名为 findrepl.bat 的帮助批处理文件 - http://www.dostips.com/forum/viewtopic.php?f=3&t=4697

type "file.txt"|findrepl "NUMBER2" /O:-0:+3

您可以从搜索结果窗口进一步搜索。

于 2013-08-02T03:43:39.430 回答