2009-04-29 21 views
28

Tôi đang cố gắng tìm một mẫu trong các tệp. Khi tôi nhận được một trận đấu bằng cách sử dụng Select-String Tôi không muốn toàn bộ dòng, tôi chỉ muốn phần phù hợp.Làm cách nào để chỉ trả lại biểu thức chính quy phù hợp khi tôi chọn chuỗi (grep) trong PowerShell?

Có thông số nào tôi có thể sử dụng để thực hiện việc này không?

Ví dụ:

Nếu tôi đã làm

select-string .-.-. 

và tập tin chứa một phù hợp với:

abc 1-2-3 abc 

Tôi muốn để có được một kết quả của chỉ 1-2 -3 thay vì toàn bộ dòng được trả lại.

Tôi muốn biết tương đương với Powershell của một grep -o

Trả lời

20

David trên con đường đúng đắn. [regex] là một máy gia tốc kiểu cho 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} 

Bạn có thể bọc trong một hàm nếu quá dài.

+0

Cảm ơn này làm việc một cách hoàn hảo! – Skyler

15

Tôi đã thử cách tiếp cận khác: Select-String trả về thuộc tính Các kết quả phù hợp có thể được sử dụng. Để có được tất cả các trận đấu, bạn phải chỉ định -AllMatches. Nếu không, nó sẽ chỉ trả về giá trị đầu tiên.

My nội dung tập tin thử nghiệm:

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

Kịch bản:

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

lợi nhuận

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

Tôi không thể làm việc này, tôi chỉ có quyền truy cập vào PS 1.0 và nó không giống như -AllMatches được công nhận trong 1.0 ít nhất. Dù sao cũng cảm ơn! – Skyler

+0

Hmm, tôi làm việc với v2, ctp3. Tôi không có khả năng cố gắng giải quyết điều đó trên v1, vì vậy xin lỗi .. – stej

+1

Hỗ trợ cho các kết quả phù hợp đã được thêm vào trong v2, ngoài ngữ cảnh. – JasonMArcher

9

Với tinh thần teach a man to fish ...

Điều bạn muốn làm là đặt đầu ra của lệnh chọn chuỗi thành Nhận thành viên, để bạn có thể xem những thuộc tính nào có đối tượng. Khi bạn làm điều đó, bạn sẽ thấy "Kết quả phù hợp" và bạn có thể chọn chỉ bằng cách chia đầu ra của bạn thành | **Select-Object** Matches.

Đề nghị của tôi là sử dụng cái gì đó như: chọn linenumber, tên tập tin, phù hợp với

Ví dụ: trên mẫu stej của:

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

Hoặc chỉ:

Select-String .-.-. .\test.txt -All | Select Matches 
Các vấn đề liên quan