item from ejemplos regex powershell select-string select-object

regex - from - select object like powershell



¿Cómo obtener los grupos capturados de Select-String? (1)

Echa un vistazo a los siguientes

$a = "http://192.168.3.114:8080/compierews/" | Select-String -Pattern ''^http://(.*):8080/(.*)/$''

$a es ahora MatchInfo ( $a.gettype() ) contiene una propiedad Matches .

PS ps:/> $a.Matches Groups : {http://192.168.3.114:8080/compierews/, 192.168.3.114, compierews} Success : True Captures : {http://192.168.3.114:8080/compierews/} Index : 0 Length : 37 Value : http://192.168.3.114:8080/compierews/

en el miembro del grupo encontrarás lo que estás buscando para que puedas escribir:

"http://192.168.3.114:8080/compierews/" | Select-String -Pattern ''^http://(.*):8080/(.*)/$'' | % {"IP is $($_.matches.groups[1]) and path is $($_.matches.groups[2])"} IP is 192.168.3.114 and path is compierews

Estoy tratando de extraer texto de un conjunto de archivos en Windows usando Powershell (versión 4):

PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | Format-Table

Hasta aquí todo bien. Eso da un buen conjunto de objetos MatchInfo :

IgnoreCase LineNumber Line Filename Pattern Matches ---------- ---------- ---- -------- ------- ------- True 30 ... file.jsp ... {...}

A continuación, veo que las capturas están en el miembro de los partidos, así que las saco:

PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | ForEach-Object -MemberName Matches | Format-Table

Lo que da:

Groups Success Captures Index Length Value ------ ------- -------- ----- ------ ----- {...} True {...} 49 47 ...

o como una lista con | Format-List | Format-List :

Groups : {matched text, captured group} Success : True Captures : {matched text} Index : 39 Length : 33 Value : matched text

Aquí es donde me detengo, no tengo idea de cómo ir más allá y obtener una lista de elementos de grupo capturados .

He intentado agregar otro | ForEach-Object -MemberName Groups | ForEach-Object -MemberName Groups , pero parece devolver el mismo que el anterior.

Lo más cercano que tengo es con | Select-Object -Property Groups | Select-Object -Property Groups , que de hecho me da lo que esperaría (una lista de conjuntos):

Groups ------ {matched text, captured group} {matched text, captured group} ...

Pero luego no puedo extraer el grupo capturado de cada uno de ellos, lo intenté | Select-Object -Index 1 | Select-Object -Index 1 Obtengo solo uno de esos conjuntos.

Actualización: una posible solución

Parece que al agregar | ForEach-Object { $_.Groups.Groups[1].Value } | ForEach-Object { $_.Groups.Groups[1].Value } lo que estaba buscando, pero no entiendo por qué, así que no puedo estar seguro de poder obtener el resultado correcto al ampliar este método para conjuntos enteros de archivos.

¿Por qué está funcionando?

Como nota al margen, esto | ForEach-Object { $_.Groups[1].Value } | ForEach-Object { $_.Groups[1].Value } (es decir, sin el segundo .Groups ) da el mismo resultado.

Me gustaría añadir que, en futuros intentos, parece que el comando se puede acortar eliminando el hilo | Select-Object -Property Groups | Select-Object -Property Groups .