2009-04-29 19 views
28

Dosyalarda bir desen bulmaya çalışıyorum. Select-String kullanarak bir eşleşme elde ettiğimde, tüm satırı istemiyorum, sadece eşleşen parçayı istiyorum.Yalnızca PowerShell'de dize (grep) seçtiğimde eşleşen normal ifadeyi nasıl döndürebilirim?

Bunu yapmak için kullanabileceğim bir parametre var mı? Örneğin

: Ben

select-string .-.-. 

yaptı ve dosya aynı hattı içeriyorsa

:

abc 1-2-3 abc 

Sadece 1-2 bir sonuç almak istiyoruz -3, satırın tamamı yerine geri dönüyor.

Ben Sen System.Text.RegularExpressions ad kullanabilirsiniz grep -o

cevap

20

David'in doğru yolda. [Ifade] bu çok ayrıntılı olup olmadığını bir işlevde olduğu sarabilirdiniz 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} 

için bir tür hızlandırıcı.

+0

Bu sayede mükemmel çalıştı! – Skyler

15

Diğer yaklaşımı denedim: Select-String, kullanılabilecek özellikteki Eşleşmeleri döndürür. Tüm maçları elde etmek için -AllMatches'i belirtmelisiniz. Aksi takdirde sadece ilk olanı döndürür.

Testim dosya içeriği:

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

senaryo:

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

döner

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

Bunu çalıştıramadım, sadece PS 1.0'a erişebiliyorum ve hiç benzemiyor —AllMatches en az 1.0'da tanınıyor. Yine de teşekkürler! – Skyler

+0

Hmm, v2, ctp3 ile çalışıyorum. Bunu v1 üzerinde çözmeye çalışmam mümkün değil, çok üzgünüm .. – stej

+1

Eşleşmelere destek, içeriğe ek olarak v2'ye eklenmiştir. – JasonMArcher

9

ruhuyla...

Ne yapmak istediğiniz, select-string komutunuzun çıktısını Get-üye içine pipetlemenizdir, böylece nesnelerin hangi özellikleri olduğunu görebilirsiniz. Bunu yaptıktan sonra, "Eşleşmeler" göreceksiniz ve çıktınızı | **Select-Object** Matches'a göndererek bunu seçebilirsiniz. Seçeneğini LineNumber, dosya

Örneğin

maçları:

Benim önerim gibi bir şey kullanmaktır stej en numunede:

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

Ya da sadece:

Select-String .-.-. .\test.txt -All | Select Matches 
İlgili konular