我有一个脚本,用于在目录中的文件内容中搜索一系列字符串(存储在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,但不确定如何。
答案 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---"
}
}
我希望自己拥有但却不知道如何获得它是唯一能找到匹配的行号。