2009-06-18 4 views
17

In Powershell finde ich mich diese Art der Sache immer und immer wieder für Begegnungen:Gibt es eine kürzere Möglichkeit, Gruppen aus einem Powershell Regex zu ziehen?

some-command | select-string '^(//[^#]*)' | 
    %{some-other-command $_.matches[0].groups[1].value} 

Also im Grunde - einen Befehl ausführen, Textzeilen erzeugt, und für jede Zeile möchte ich auf ein einen Befehl auszuführen Regex-Capture innerhalb der Zeile (wenn es übereinstimmt). Scheint wirklich einfach. Das obige funktioniert, aber gibt es eine kürzere Möglichkeit, diese Regex-Capture-Gruppen herauszuziehen? Perl hatte $ 1 und so weiter, wenn ich mich recht erinnere. Posh muss etwas ähnliches haben, oder? Ich habe "$ Matches" Referenzen auf SO gesehen, kann aber nicht herausfinden, was das bringt.

Ich bin sehr neu zu PowerShell BTW, gerade erst begonnen zu lernen.

Antwort

14

Sie können das -match Operator Ihren Befehl umformulieren:

some-command | Foreach-Object { if($_ -match '^(//[^#]*)') { some-other-command $($matches[1])}} 
+0

Eh? Er stimmt mit einer Zeile überein, die mit Doppel-Schrägstrich (//) beginnt und gierig bis zum (aber nicht zum) ersten Hash (#) passt. Es gibt keine Markierung am Ende der Zeile, also passt er nicht spezifisch auf die gesamte Zeile. –

+0

Ja, das ist die Art von Dingen, nach denen ich gesucht habe. Danke für die Bearbeitung, Bas. – scobi

4

Sie dieses versuchen könnte:

Get-Content foo.txt | foreach { some-othercommand [regex]::match($_,'^(//[^#]*)').value } 
+0

Für mich gibt dies eine leere Zeile aus, wenn der Eingang nicht übereinstimmt. [Bas Bossink] (http://stackoverflow.com/a/1011163/111424) Die Antwort funktioniert wie diese, gibt aber nur die Treffer aus. –

7

Named Ersatz

'foo bar' -replace '(?<First>foo).+', '${First}' 

Returns: foo

Unbenannt Ersatz

'foo bar' -replace '(foo).+(ar)', '$2 z$2 $1' 

Rückkehr: ar zar foo

Verwandte Themen