![在 Windows 中使用有关匹配行的上下文进行 Grep](https://linux22.com/image/1390126/%E5%9C%A8%20Windows%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%9C%89%E5%85%B3%E5%8C%B9%E9%85%8D%E8%A1%8C%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%96%87%E8%BF%9B%E8%A1%8C%20Grep.png)
我想在 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