2009-04-29 6 views
28

Estoy tratando de encontrar un patrón en los archivos. Cuando obtengo una coincidencia usando Select-String no quiero toda la línea, solo quiero la parte que coincida.¿Cómo devuelvo solo la expresión regular coincidente cuando selecciono string (grep) en PowerShell?

¿Hay algún parámetro que pueda usar para hacer esto?

Por ejemplo:

Si lo hiciera

select-string .-.-. 

y el archivo contenía una línea con:

abc 1-2-3 abc 

me gustaría obtener un resultado de 1-2 apenas -3 en lugar de devolver la línea completa.

Me gustaría saber el equivalente de un Powershell grep -o

Respuesta

20

David en el camino correcto. [Expresiones regulares] es un acelerador de tipo para 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} 

Se puede envolver en una función que si eso es demasiado prolijo.

+0

Gracias esto funcionó perfectamente! – Skyler

15

Intenté otro enfoque: Select-String returns property Partidas que se pueden utilizar. Para obtener todas las coincidencias, debe especificar -AllMatches. De lo contrario, solo devuelve el primero.

Mi contenido de archivo de prueba:

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

El guión:

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

vuelve

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

No pude conseguir que funcione, solo tengo acceso a PS 1.0 y no parece que -AllMatches se reconozca en 1.0 al menos. ¡Gracias de todos modos! – Skyler

+0

Hmm, trabajo con v2, ctp3. No tengo ninguna posibilidad de intentar resolver eso en v1, así que lo siento. – stej

+1

El soporte para coincidencias se agregó en v2, además del contexto. – JasonMArcher

9

En el espíritu de teach a man to fish ...

Lo que quiere hacer es canalizar la salida de su comando de cadena de selección en Miembro de contacto, para que pueda ver qué propiedades tienen los objetos. Una vez que lo hagas, verás "Coincidencias" y puedes seleccionar eso simplemente conectando tu salida al | **Select-Object** Matches.

Mi sugerencia es usar algo como: seleccione LineNumber, nombre de archivo, coincide

Por ejemplo: en la muestra 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

O simplemente:

Select-String .-.-. .\test.txt -All | Select Matches 
Cuestiones relacionadas