【发布时间】:2013-06-12 14:51:03
【问题描述】:
我使用 powershell 中的 select-string 并且效果很好,但有时我不喜欢它为我提供匹配的整行,因为它包含(对我而言)不必要的信息。
有没有简单的方法让它在正则表达式之前只给我 10 个字符,在正则表达式之后给我 15 个字符? 我现在如何使用它的示例:
gci *.log | select-string "lastname"
【问题讨论】:
我使用 powershell 中的 select-string 并且效果很好,但有时我不喜欢它为我提供匹配的整行,因为它包含(对我而言)不必要的信息。
有没有简单的方法让它在正则表达式之前只给我 10 个字符,在正则表达式之后给我 15 个字符? 我现在如何使用它的示例:
gci *.log | select-string "lastname"
【问题讨论】:
制作正则表达式(.{10})lastname(.{15}) 并使用Where-Object 和-match 运算符而不是Select-String:
gci *.log | ? { $_ -match '(.{10})lastname(.{15})' } | % {
"{0}`t{1}" -f ($matches[1], $matches[2])
}
【讨论】:
你需要使用组,你可以像这样使用命名组:
gci c:\temp\_sotemp\*.log |
select-string -Pattern "(?<refvalue>lastname)" |
select -expand Matches |
foreach {$_.groups["refvalue"].value}
【讨论】:
请记住,您总是将管道对象发送到 Get-Member 以查看属性。
PS C:\> $text = 'asdfqwerasdfqwerlastnameasdfqwerasdfqwerasdf'
PS C:\> $text | Select-String -Pattern 'lastname' | Get-Member
Name MemberType Definition
---- ---------- ----------
...
Matches Property System.Text.RegularExpressions.Match[] Matches {get;set;}
PS C:\> ($text | Select-String -Pattern 'lastname').Matches
Groups : {lastname}
Success : True
Captures : {lastname}
Index : 16
Length : 8
Value : lastname
PS C:\> $index = ($text | Select-String -Pattern 'lastname').Matches.Index
PS C:\> $text[($index-10)..($index+15)] -join ''
erasdfqwerlastnameasdfqwer
【讨论】: