web-dev-qa-db-fra.com

Comment renvoyer uniquement l'expression régulière correspondante lorsque je sélectionne une chaîne (grep) dans PowerShell?

J'essaie de trouver un modèle dans les fichiers. Lorsque j'obtiens une correspondance en utilisant Select-String Je ne veux pas la ligne entière, je veux juste la partie qui correspond.

Y a-t-il un paramètre que je peux utiliser pour ce faire?

Par exemple:

Si j'ai fait

select-string .-.-.

et le fichier contenait une ligne avec:

abc 1-2-3 abc

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

Je voudrais connaître l'équivalent Powershell d'un grep -o

41
Skyler

David est 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 cela dans une fonction si c'est trop verbeux.

26
Steven Murawski

Ou juste:

Select-String .-.-. .\test.txt -All | Select Matches
38
Keith Hill

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

Le contenu de mon 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 }

retour

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 sur technet.Microsoft.com

21
stej

Dans l'esprit de apprendre à un homme à pêcher ...

Ce que vous voulez faire est de diriger la sortie de votre commande select-string dans Get-member , afin que vous puissiez voir quelles propriétés ont les objets. Une fois que vous avez fait cela, vous verrez "Correspondances" et vous pouvez sélectionner cela en redirigeant votre sortie vers | **Select-Object** Matches.

Ma suggestion est d'utiliser quelque chose comme: sélectionner le numéro de lin, le nom du fichier, les correspondances

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}
11
Jaykul

Aucune des réponses ci-dessus n'a fonctionné pour moi. Ce qui suit a fait.

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} # renvoie uniquement la valeur du champ Correspondances de l'objet. (Cela permet plusieurs correspondances de résultats.)

3
7r4c0r

Vous pouvez utiliser l'espace de noms System.Text.RegularExpressions:

http://msdn.Microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx

2
David McEwing