Wie komme ich nur den passenden regulären Ausdruck, wenn ich select-string (grep) in Powershell?

StackOverflow https://stackoverflow.com/questions/804754

  •  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

War es hilfreich?

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

Select-String bei technet.microsoft.com

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top