在Powershell Select-String中使用Context

时间:2013-01-03 21:19:19

标签: powershell

我有一个脚本,用于在目录中的文件内容中搜索一系列字符串(存储在txt文件中)。我想修改它以列出找到的字符串周围的文本(这些是常规字符串,而不是正则表达式)。我玩了很多,似乎我需要使用-Co​​ntext,但我不知道如何从中获取文本。

另外,我搜索的文件可能没有换行符,所以如果它只能在搜索词之前和之后获取xx字符,那就更好了。

这是我到目前为止所做的事情(我省略了循环文件部分):

$result = Get-Content $file.FullName | Select-String $control -quiet  
If ($result -eq $True) 
{ 
  $match = $file.FullName 
  "Match on string :  $control  in file :  $match" | Out-File $output -Append 
  Write-host "Match on string :  $control  in file :  $match"
} 

如果它可以写上下文,那将是完美的。好像我需要使用$ _Matches,但不确定如何。

2 个答案:

答案 0 :(得分:1)

如果$control只是一个常规字符串,你能把它变成正则表达式吗?

$n  = 3
$re = "(.{0,$n})(" + [Regex]::Escape($control) + ")(.{0,$n})"

$result = (Get-Content $file.FullName) -match $re

有了这个,$matches散列表可以让您在匹配前后访问$n个字符:

if ($result.Length -gt 0) {
  echo "Before: $($matches[1])"
  echo "After:  $($matches[3])"
}

答案 1 :(得分:0)

这是我现在所拥有的,似乎有效:

  $regex = "[\s\S]{0,$ContextChars}$SearchTerm[\s\S]{0,$ContextChars}"
  $results = Get-Content $file.FullName | Select-String -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value }      

  if ($results)
  {
    foreach($result in $results)
    {
      $display = $result
      "File: $file   Match ---$display---"  
    }
  }  

我希望自己拥有但却不知道如何获得它是唯一能找到匹配的行号。