Grep z kontekstem na temat dopasowanych linii w systemie Windows

1

Chcę wyszukiwać w plikach, rekurencyjnie, ze wzorem dla nazwy pliku, dla danego ciągu, w wierszu polecenia systemu Windows 7. Jestem zaznajomiony z Uniksem. Jak dotąd,

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

jest dobrym zamiennikiem

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

Jeśli chcę pokazać kontekst dla każdej dopasowanej linii (niektóre wiersze przed i po), jak mam to zrobić? Polecenie Unix to

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

W tej chwili korzystałem z MinGW i myślę, że UnxUtils, GnuWin32 itp. Mogą działać, ale szukam natywnego polecenia Windows lub sekwencji / potoku poleceń.

EDYTOWAĆ : Wysłano już jedną dobrą odpowiedź, która daje ciągłe, jednokolorowe wyjście. Jako pytanie spontaniczne, czy jest jakiś sposób na kolorowanie pierwszej linii sekwencji opisanej dla każdego znaleziska, aby można było łatwo odróżnić każdą sekwencję? Czy informacje o pliku / linii nr. być także kolorowane? Dobrze byłoby mieć coś konfigurowalnego w profilu (np. Przez greping „& gt”), ​​więc to samo polecenie podane w rozwiązaniu daje wyjście w kolorach. Powershell: Prawidłowe farbowanie Get-Childitem wyjście raz na zawsze prawdopodobnie ma znaczenie ...

sancho.s
źródło

Odpowiedzi:

4

Windows 7 ma już zainstalowaną aplikację PowerShell.

dla linii poleceń PowerShell

WIN + R PowerShell

następnie z wiersza polecenia PowerShell możesz spróbować czegoś takiego

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

gdzie gci to Get-ChildItem     -r lub -recurse dla rekurencji     -fi lub -filter dla pasujących plików * .py     -patt lub wzorzec dla pasującego ciągu „main”     -co lub -context 2,3 dla 2 linii przed 3 po

linie wyjściowe z symbolem większym niż na początku wskazują pasujące linie

---------------- EDYCJA PONIŻEJ --------------------

Uporządkowane, aby zwiększyć czytelność wydruku i z kolorem dla pliku i linii kontekstu.

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)})
"";""}

odwoływany z: http://msmvps.com/blogs/richardsiddaway/archive/2013/01.aspx

Antony
źródło
powinienem wrócić i uporządkować trochę, nie moje ulubione narzędzie ale cieszę się, jeśli to pomogło
Antony