在 Windows 中使用有关匹配行的上下文进行 Grep

在 Windows 中使用有关匹配行的上下文进行 Grep

我想在 Windows 7 命令提示符中,使用文件名模式递归搜索给定字符串的文件。我熟悉 Unix。到目前为止,

findstr /spin /c:"main" *.py

是一个很好的替代品

find . -name "*.py" -exec grep -nH "main" {} \;

现在,如果我想显示每个匹配行(前后几行)的一些上下文,我该怎么做?Unix 命令是

find . -name "*.py" -exec grep -nH -B 2 -A 2 "main" {} \;

到目前为止,我使用了 MinGW,我猜 UnxUtils、GnuWin32 等也可能有效,但我正在寻找本机 Windows 命令或命令序列/管道。

编辑:已经发布了一个很好的答案,它给出了连续的单色输出。作为一个衍生问题,是否有任何方法可以为每个发现报告的序列的第一行着色,以便人们可以轻松区分每个序列?有关文件/行号的信息也可以着色吗?在配置文件中有一些可配置的内容会很好(例如,通过 greping“>”),因此解决方案中给出的相同命令会给出带有颜色的输出。 Powershell:一劳永逸地正确着色 Get-Childitem 输出可能相关...

答案1

Windows 7 已安装 Powershell。

对于 Powershell 命令行

WIN+R 电源外壳

然后从 powershell 命令提示符中你可以尝试类似

gci -r -fi '*.py' | Select-String -patt "main" -context 2,3

其中 gci 是 Get-ChildItem -r 或 -recurse 用于递归 -fi 或 -filter 用于匹配文件 *.py -patt 或 pattern 用于匹配字符串“main” -co 或 -context 2,3 用于前 2 行后 3 行

输出中以大于号开头的行表示匹配的行

----------------以下编辑--------------------

整理后输出更加易读,文件和上下文行带有颜色。

gci -r -fi '*.py'| Select-String -pattern "main" -context 2,3 | foreach { "";
$padlength = (”{0}       ” -f $_.LineNumber).Length
$pad = ” “*$padlength
$drawlength = (”{0}{1}: ” -f $_.Path, $_.LineNumber).Length
$draw = "-"*$drawlength
$(""| foreach {$_.Trim().Insert(0,$draw)});"";""
Write-Host -Fore Blue $_.Path; "";""
$($_.Context.PreContext | foreach {$_.Trim().Insert(0,$pad)})
Write-Host -Fore Magenta $(”LINE {0}: {1}” -f $_.LineNumber, ($_.Line).Trim())
$($_.Context.PostContext | foreach {$_.Trim().Insert(0,$pad)})
"";""}

引用自: http://msmvps.com/blogs/richardsiddaway/archive/2013/01.aspx

相关内容