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 に答える