2009-06-18 28 views
17

Trong PowerShell tôi thấy mình làm loại điều hơn và hơn nữa cho các trận đấu:Có cách nào ngắn hơn để kéo các nhóm ra khỏi một regex của Powershell không?

some-command | select-string '^(//[^#]*)' | 
    %{some-other-command $_.matches[0].groups[1].value} 

Vì vậy, về cơ bản - chạy một lệnh mà tạo ra dòng văn bản, và cho mỗi dòng tôi muốn chạy một lệnh trên regex chụp bên trong dòng (nếu nó phù hợp). Có vẻ rất đơn giản. Các công trình trên, nhưng có cách nào ngắn hơn để rút ra các nhóm nắm bắt regex đó không? Perl có $ 1 và cứ thế, nếu tôi nhớ đúng. Posh phải có một cái gì đó tương tự, phải không? Tôi đã nhìn thấy tài liệu tham khảo "$ phù hợp" trên SO nhưng không thể tìm ra những gì làm cho nó được thiết lập.

Tôi rất mới với PowerShell btw, chỉ mới bắt đầu học.

Trả lời

14

Bạn có thể sử dụng toán tử -match để tái cấu trúc lệnh của bạn như:

some-command | Foreach-Object { if($_ -match '^(//[^#]*)') { some-other-command $($matches[1])}} 
+0

Hả? Anh ấy phù hợp với một dòng bắt đầu với dấu gạch chéo kép (//) và tham lam phù hợp cho đến khi (nhưng không bao gồm) giá trị băm đầu tiên (#). Không có điểm đánh dấu cuối dòng, do đó, anh ấy không cụ thể khớp với toàn bộ dòng. –

+0

Vâng, đó là loại điều tôi đang tìm kiếm. Cảm ơn bạn đã chỉnh sửa, Bas. – scobi

4

Bạn có thể thử này:

Get-Content foo.txt | foreach { some-othercommand [regex]::match($_,'^(//[^#]*)').value } 
+0

Đối với tôi kết quả đầu ra này là một dòng trống nếu đầu vào không khớp. [Bas Bossink] (http://stackoverflow.com/a/1011163/111424) 's câu trả lời hoạt động như thế này nhưng kết quả đầu ra chỉ phù hợp. –

7

Đặt tên thay thế

'foo bar' -replace '(?<First>foo).+', '${First}' 

Returns: foo

Không được đặt tên thay thế

'foo bar' -replace '(foo).+(ar)', '$2 z$2 $1' 

Returns: ar ZAR foo

Các vấn đề liên quan