2011-07-11 14 views
10

Tengo un archivo de texto que contiene líneas muy largas. Necesito una información de cada línea y necesito ver los valores únicos. Mi idea original era usar Select-String y especificar una expresión regular con un grupo de captura. He visto varias otras publicaciones pero ninguna funcionó. Aquí está el rápido y sucio equivalente de C#:Seleccionar-Cadena a grep, pero solo devolver grupos únicos

var text = File.ReadAllText(@"path\File.txt"); 
var r = new Regex("Path=\"(.*?)\""); 
var matches = r.Matches(text); 

var h = new HashSet<string>(); 

foreach(Match match in matches) 
{ 
    h.Add(match.Groups[1].Value); 
} 

foreach (var s in h) 
{ 
    Console.WriteLine(s); 
} 

¿Cómo puedo hacer esto en PowerShell?

ACTUALIZACIÓN:

Prueba de las respuestas, me di cuenta de que hay un requisito adicional. Puede haber múltiples coincidencias por línea de fuente. Ejemplo:

Path="One" Path="Two" 
Path="Two" Path="Three"

resultados deben ser:

One 
Two 
Three

Respuesta

16
select-string -path <filepath> -pattern 'Path=\"(.*?)\"' -allmatches | 
    foreach-object {$_.matches} | 
    foreach-object {$_.groups[1].value} | 
    Select-Object -Unique 
+0

Consulte la actualización anterior. Además, tenga en cuenta que el texto proviene de un archivo. – TrueWill

+0

Actualizado para nuevos requisitos. – mjolinor

+0

Esto funcionó, excepto para el get-unique. Si lo reemplacé con select-object -Unique funcionó perfectamente. Personalmente, me parece más claro que las respuestas '[regex]'. – TrueWill

2

Si Te lo siguiente:

Get-Content file.txt | Foreach-Object { [regex]::match($_,'Path="(.*?)"').Groups[1].Value} | Select-Object -Unique 

ACTUALIZACIÓN:

PS > Select-String -Path file.txt -Pattern 'Path="([^"]+)"' -AllMatches | Select-Object -ExpandProperty Matches | Foreach-Object {$_.Groups[1].Value} | Select-Object -Unique 

One 
Two 
Three 
+0

Consulte la actualización anterior. ¿Y se puede hacer esto con select-string? – TrueWill

+0

Actualizado usando Select-String. –

1

De acuerdo con sus comentarios:

${c:\silogix\t.txt} | % {[regex]::matches($_, 'Path="(.*?)"')} | % {$_.Groups[1].value} | Select-Object -Unique 

CUIDADO: ${file-path} lee el archivo como Get-Content, pero file-path debe ser absoluto!

+0

+1 - funciona, y corto. – TrueWill

Cuestiones relacionadas