2009-04-29 5 views
28

J'essaie de trouver un motif dans les fichiers. Quand je reçois un match en utilisant Select-String Je ne veux pas la ligne entière, je veux juste la partie qui correspond.Comment renvoyer uniquement l'expression régulière correspondante lorsque je sélectionne string (grep) dans PowerShell?

Y at-il un paramètre que je peux utiliser pour faire cela?

Par exemple:

Si je ne

select-string .-.-. 

et le fichier contenait une ligne avec:

abc 1-2-3 abc 

J'aimerais obtenir un résultat de seulement 1-2 -3 au lieu de renvoyer la ligne entière.

Je voudrais savoir l'équivalent d'un Powershell grep -o

Répondre

20

David sur la bonne voie. [Regex] est un accélérateur de type pour 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} 

Vous pouvez envelopper que dans une fonction si cela est trop bavard.

+0

Merci cela a fonctionné parfaitement! – Skyler

15

J'ai essayé une autre approche: Select-String renvoie la propriété Matches qui peuvent être utilisés. Pour obtenir toutes les correspondances, vous devez spécifier -AllMatches. Sinon, il retourne seulement le premier.

Mon contenu du fichier de test:

test test1 alk atest2 asdflkj alj test3 test 
test test3 test4 
test2 

Le script:

select-string -Path c:\temp\select-string1.txt -Pattern 'test\d' -AllMatches | % { $_.Matches } | % { $_.Value } 

retours

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 at technet.microsoft.com

+1

Je ne pouvais pas faire fonctionner celui-ci, j'ai seulement accès à PS 1.0 et il ne ressemble pas à -AllMatches est reconnu dans 1.0 au moins. Merci quand même! – Skyler

+0

Hmm, je travaille avec v2, ctp3. Je n'ai aucune possibilité d'essayer de résoudre cela sur la v1, donc désolé .. – stej

+1

La prise en charge des correspondances a été ajoutée dans v2, en plus du contexte. – JasonMArcher

9

Dans l'esprit deCe que vous voulez faire est de diriger la sortie de votre commande select-string vers Get-member, afin que vous puissiez voir les propriétés des objets. Une fois que vous faites cela, vous verrez "Matches" et vous pouvez sélectionner juste cela en passant votre sortie à | **Select-Object** Matches.

Ma suggestion est d'utiliser quelque chose comme: sélectionnez linenumber, nom de fichier, correspond

Par exemple: sur l'échantillon de STEJ:

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} 
33

Ou tout simplement:

Select-String .-.-. .\test.txt -All | Select Matches 
Questions connexes