4

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

另外,我正在搜索的文件可能没有换行符,所以如果它可以在搜索词之前和之后获取 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,但不确定如何。

4

2 回答 2

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])"
}
于 2013-01-03T23:48:22.283 回答
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---"  
    }
  }  

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

于 2013-01-04T22:09:12.287 回答