Wie komme ich nur den passenden regulären Ausdruck, wenn ich select-string (grep) in Powershell?
-
03-07-2019 - |
Frage
Ich versuche, ein Muster in Dateien zu finden. Wenn ich ein Spiel mit Select-String
bekomme ich nicht die gesamte Linie wollen, ich will nur den Teil, der abgestimmt.
Gibt es einen Parameter kann ich dies tun verwenden?
Zum Beispiel:
Wenn ich das täte
select-string .-.-.
und die Datei enthält eine Zeile mit:
abc 1-2-3 abc
Ich möchte ein Ergebnis erhalten, von nur 1-2-3 , anstatt die gesamte Zeile zurückgegeben zu werden.
Ich möchte die Powershell-Äquivalent eines grep -o
wissen
Lösung
Davids auf dem richtigen Weg. [Regex] ist ein Beschleuniger für System.Text.RegularExpressions.Regex
[regex]$regex = '.-.-.'
$regex.Matches('abc 1-2-3 abc') | foreach-object {$_.Value}
$regex.Matches('abc 1-2-3 abc 4-5-6') | foreach-object {$_.Value}
Sie können wickeln, dass in einer Funktion, wenn das zu ausführlich ist.
Andere Tipps
Oder einfach:
Select-String .-.-. .\test.txt -All | Select Matches
Ich habe versucht, anderen Ansatz: Select-String zurückgibt Eigenschaft Spiele, die verwendet werden können. Um alle Spiele, müssen Sie -AllMatches angeben. Ansonsten gibt es nur die ersten.
Meine Testdatei Inhalt:
test test1 alk atest2 asdflkj alj test3 test
test test3 test4
test2
Das Skript:
select-string -Path c:\temp\select-string1.txt -Pattern 'test\d' -AllMatches | % { $_.Matches } | % { $_.Value }
Rückkehr
test1 #from line 1
test2 #from line 1
test3 #from line 1
test3 #from line 2
test4 #from line 2
test2 #from line 3
Im Geist der einen Mann lehren ...
fischen Was Sie tun möchten, ist die Ausgabe des SELECT-String-Befehl in Get-Mitglied , damit Sie sehen können, welche Eigenschaften die Objekte haben. Sobald Sie das tun, werden Sie „Spielen“ sehen und Sie können wählen Sie einfach die von Ihrem Ausgang | **Select-Object** Matches
kochend.
ist mein Vorschlag, etwas ähnliches zu verwenden: select Zeilennummer, Dateiname, entspricht
Zum Beispiel: auf stej der Probe:
sls .\test.txt -patt 'test\d' -All |select lineNumber,fileName,matches |ft -auto
LineNumber Filename Matches
---------- -------- -------
1 test.txt {test1, test2, test3}
2 test.txt {test3, test4}
3 test.txt {test2}
Keine der oben genannten Antworten für mich gearbeitet. Die unten hat.
Get-Content -Path $pathToFile | Select-String -Pattern "'test\d'" | foreach {$_.Matches.Value}
Get-Content -Path $pathToFile | # Get-Content will divide into single lines for us
Select-String -Pattern "'test\d'" | # Define the Regex
foreach {$ _. Matches.Value} # nur geben den Wert der Spiele Feld des Objekts. (Dies ermöglicht mehrere Ergebnisübereinstimmungen.)
Sie können die System.Text.RegularExpressions Namespace verwenden:
http://msdn.microsoft.com /en-us/library/system.text.regularexpressions.regex.aspx