1

我使用 powershell 中的 select-string 并且效果很好,但有时我不喜欢它给我匹配的整行,因为它包含(对我而言)不必要的信息。

有没有简单的方法让它在正则表达式之前只给我 10 个字符,在正则表达式之后给我 15 个字符?我现在如何使用它的示例:

gci *.log | select-string "lastname"
4

3 回答 3

3

制作正则表达式(.{10})lastname(.{15})Where-Object-match运算符一起使用,而不是Select-String

gci *.log | ? { $_ -match '(.{10})lastname(.{15})' } | % {
  "{0}`t{1}" -f ($matches[1], $matches[2])
}
于 2013-06-12T15:07:01.530 回答
2

您需要使用组,您可以使用这样的命名组:

gci c:\temp\_sotemp\*.log | 
    select-string -Pattern "(?<refvalue>lastname)" | 
    select -expand Matches | 
    foreach {$_.groups["refvalue"].value}
于 2013-06-12T15:06:21.547 回答
2

请记住,您总是让管道对象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
于 2013-06-12T17:57:33.960 回答