【问题标题】:Using -like to find strings with Powershell使用 -like 在 Powershell 中查找字符串
【发布时间】:2020-02-05 04:46:30
【问题描述】:

在 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,但它只返回一个空值。

【问题讨论】:

  • 可以转义通配符和其他正则表达式特殊字符 --> $k = [regex]::Escape($errors[$i])
  • 初始化数组:[bool[]]$results = @( (,$false) * $errors.length )
  • 您还可以为接受标准通配符的运算符转义 PowerShell 通配符 --> [WildcardPattern]::Escape($errors[$i]).

标签: regex powershell


【解决方案1】:

你可以试试:

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 包含在正则表达式中具有特殊含义的字符,则需要用反斜杠转义它们。一个简单的方法是调用 Regex .NET 类方法Escape()

【讨论】:

  • 这给了我从文本文件中第一个想要的单词到最后一个想要的单词。每个错误都在它们自己的部分中,它们被这些所需的单词分开。我需要每个部分都在他们自己的数组项中,所以我可以从那里继续。另外,我不能给你内容,因为它包含 PHI。谢谢。
  • 您应该提供文件中的示例数据。您可以删除敏感信息。
  • ~HL~firstname~error1~city~state~HL~business~notAnError~employeeID~HL~firstname~lastname~error2~supervisorID~HL~division~error1~customerID~HL 以上文字得到在 $content 中,~HL 是所需的单词,error1 和 error2 是 $errors 中列出的错误。 ~notAnError~ 没有在 $error 中列出,因此应该被忽略。
猜你喜欢
  • 2018-06-14
  • 2011-06-11
  • 2020-06-03
  • 2014-09-29
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多