2013-01-03 57 views
3

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

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

回答

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])" 
} 
+0

好点。固定。 –

+0

您也可以将检查修改为“if($ result)'哪(在我眼里)读得更好。但是,也许我在PowerShell中使用了太多的高尔夫球;) – Joey

+0

这会使'$ result'看起来像一个布尔值,事实并非如此。即使语言允许,我也希望避免这种混淆。 –

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---" 
    } 
    } 

我希望我有的唯一的事情,但不知道如何得到它是找到匹配的行号。

相关问题