2013-01-03 56 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---" 
    } 
    } 

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

相關問題