如何使用powershell选择字符串来获得正则表达式周围的部分



我使用powershell的select-string,它工作得很好,但有时我不喜欢它给我匹配的整行,因为它包含(对我来说)不必要的信息。

是否有简单的方法让它给我只是10个字符之前,regex, regex和15个字符之后?我现在使用它的例子:

gci *.log | select-string "lastname"

使regexp为(.{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

相关内容

  • 没有找到相关文章

最新更新