Использование -like для поиска строк с помощью Powershell - PullRequest
0 голосов
/ 04 февраля 2020

В Powershell мне нужно найти несколько ошибок в текстовом файле и ближайшее слово между ними. Каждая ошибка содержится в массиве. В прошлом я использовал бы код:

#creating null array
$results = @("")
#creating index for array
for ($i = 0; $i -lt ($errors.length - 1); $i++)
{
    $results += $false
}
#selecting string
for ($i = 0; $i -lt $errors.length; $i++)
{
     $k = $errors[$i]
     $rg = [regex]"WORD.*?$k.*?WORD"
     $results[$i] = $content | Select-String -Pattern $rg -AllMatches | Foreach-Object {($_.Matches |
                    ForEach-Object {$_.value})}
}

$errors - массив ошибок, $content - содержимое текстового файла, и каждый элемент в $results содержит строку из желаемое слово к ошибке к желаемому слову.

Использование $results[$i] = $content | Select-String -Pattern $rg -AllMatches | Foreach-Object {($_.Matches | ForEach-Object {$_.value})} не работает, потому что мои ошибки содержат подстановочные знаки, такие как звездочки.

Я знаю, что для того, чтобы я мог делать такие символы, мне нужно использовать -like

Я попытался использовать $results[$i] = $content -like $k вместо этого, но это только возвращает нулевое значение.

1 Ответ

0 голосов
/ 04 февраля 2020

Вы можете попробовать:

for ($i = 0; $i -lt $errors.length; $i++)
{
     $k = [regex]::Escape($errors[$i])
     $rg = [regex]"(?s)WORD.*?$k.*?WORD"
     $results[$i] = $content | Select-String -Pattern $rg -AllMatches |
         Foreach-Object { $_.Matches.Value }
}

Я не знаю, что внутри $errors, $results или $content. Если вы хотите работать так, как задумано, в то время как $content занимает несколько строк, тогда $content должна быть одной строкой, прежде чем она будет передана в Select-String. В противном случае ваше регулярное выражение будет совпадать только с одной строкой за раз.

Поскольку вы можете захотеть, чтобы .*? совпадал с несколькими строками, вам следует использовать режим (?s), чтобы . мог сопоставлять символы новой строки. .

Если $errors содержит символы, которые имеют специальное значение в регулярном выражении, вам потребуется backsla sh, чтобы избежать их. Самый простой способ сделать это - вызвать метод класса Regex. NET Escape().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...