我使用 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