2009-06-18 4 views
17

Dans PowerShell je me retrouve à faire ce genre de chose encore et encore pour les matchs:Existe-t-il un moyen plus court de sortir des groupes d'une regex de Powershell?

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

Donc, fondamentalement, - exécuter une commande qui génère des lignes de texte, et pour chaque ligne que je veux exécuter une commande sur un regex capture à l'intérieur de la ligne (si elle correspond). Semble vraiment simple. Les travaux ci-dessus, mais y at-il un moyen plus court de retirer ces groupes de capture regex? Perl avait 1 $ et ainsi de suite, si je me souviens bien. Posh doit avoir quelque chose de similaire, non? J'ai vu des références "$ matches" sur SO, mais je n'arrive pas à comprendre ce qui fait que ça se passe. Je suis très nouveau à PowerShell btw, j'ai juste commencé à apprendre.

Répondre

14

Vous pouvez utiliser l'opérateur -match à reformuler votre commande comme:

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

Hein? Il correspond à une ligne qui commence par double-barre oblique (//) et qui correspond avec avidité jusqu'à (mais excluant) le premier hachage (#). Il n'y a pas de marqueur de fin de ligne, donc il ne correspond pas spécifiquement à la ligne entière. –

+0

Ouais, c'est le genre de chose que je cherchais. Merci pour l'édition, Bas. – scobi

4

Vous pouvez essayer ceci:

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

Pour moi, cela génère une ligne vide si l'entrée ne correspond pas. La réponse de [Bas Bossink] (http://stackoverflow.com/a/1011163/111424) fonctionne comme celle-ci mais ne renvoie que les résultats. –

7

nommé remplacement

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

Renvoie: foo

remplacement Unnamed

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

Renvoie: ar zar foo

Questions connexes