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
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.
Ou juste:
Select-String .-.-. .\test.txt -All | Select Matches
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
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}
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.)
Vous pouvez utiliser l'espace de noms System.Text.RegularExpressions:
http://msdn.Microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx