2009-04-29 5 views
28

Sto cercando di trovare uno schema nei file. Quando ottengo una corrispondenza usando Select-String Non voglio l'intera riga, voglio solo la parte che corrisponde.Come restituire solo l'espressione regolare corrispondente quando seleziono-stringa (grep) in PowerShell?

C'è un parametro che posso usare per fare questo?

Ad esempio:

Se ho fatto

select-string .-.-. 

e il file conteneva una linea con:

abc 1-2-3 abc 

mi piacerebbe ottenere un risultato di appena 1-2 -3 anziché restituire l'intera riga.

Vorrei sapere l'equivalente di un Powershell grep -o

risposta

20

David sulla strada giusta. [Regex] è un tipo di acceleratore per 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} 

Si potrebbe avvolgere che in una funzione se questo è troppo prolisso.

+0

Grazie questo ha funzionato perfettamente! – Skyler

15

Ho provato un altro approccio: Select-String restituisce proprietà Corrispondenze che possono essere utilizzate. Per ottenere tutte le corrispondenze, devi specificare -Tutti i file. Altrimenti restituisce solo il primo.

Il mio tenore di file di test:

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

Lo script:

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

rendimenti

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

Non riesco a far funzionare questo, ho solo accesso a PS 1.0 e non sembra -AllMatches è riconosciuto in 1.0 almeno. Grazie comunque! – Skyler

+0

Hmm, lavoro con v2, ctp3. Non ho la possibilità di provare a risolverlo sulla v1, quindi mi dispiace .. – stej

+1

Il supporto per le partite è stato aggiunto in v2, oltre al contesto. – JasonMArcher

9

Nello spirito di teach a man to fish ...

Quello che si vuole fare è convogliare l'output del comando select-string in Get-member, in modo da poter vedere quali proprietà hanno gli oggetti. Una volta che lo fai, vedrai "Corrispondenze" e potrai selezionarlo semplicemente eseguendo il piping dell'output su | **Select-Object** Matches.

Il mio suggerimento è quello di usare qualcosa come: select LineNumber, il nome del file, corrisponde

Ad esempio: sul campione di 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 semplicemente:

Select-String .-.-. .\test.txt -All | Select Matches 
Problemi correlati