需要正则表达式才能找到单词“ERROR:”,但不匹配“ERROR: Opening Local File”

JJM*_*JJM 11 powershell regex

我正在用 PowerShell 编写一个错误检查脚本来查看 Bitvise SFTP 日志并在出现任何错误时发出警报。但是,我不希望它在字符串“错误:打开本地文件”上提醒我,因为这只是告诉我该文件已存在于目标中,这是预期的。我不太擅长正则表达式,除了我们可以忽略的错误之外,我似乎无法找到正确的元素组合来查找错误。

例子:

ERROR: Writing local file  (I want to be alerted to this)
ERROR: Opening local file  (I don't want to be alerted to this)
Run Code Online (Sandbox Code Playgroud)

Glo*_*del 40

正如@spikey_richie 所说,你需要负前瞻

ERROR: (?!Opening local file)
Run Code Online (Sandbox Code Playgroud)

基本上,不是指定您要查找的内容,而是指定您想要的内容,并将其包装在(?!和 中)

演示

  • @JJM:你可能更喜欢另一个答案,但对我来说,这个答案更准确、更准确地回答了你提出的问题(如何找到带有“错误:”但不匹配“错误:打开本地文件”的行) ...所以我认为它应该是公认的答案(即对所问问题的适当答案,无论提问者最终使用的是什么) (2认同)
  • @OlivierDulac,实际上我最初确实将其标记为答案。但是,解决方案复选标记的悬停文本建议我们选择“最有助于找到我们的解决方案”的答案。我选择了另一个作为我的解决方案,所以我将其标记为答案。 (2认同)
  • 我的答案可能更好地回答了*问题*,但另一个答案更好地回答了*问题*。接受那个是完全有道理的,我一点也不介意@JJM。我什至得到了一个不错的徽章:https://superuser.com/help/badges/37/populist?userid=442468 (2认同)

小智 14

这似乎可以满足您的需求 - 它使用 PoSh 可以将正则表达式匹配应用于整个集合的方式。[咧嘴笑]

它能做什么 ...


  • 在准备好真正执行此操作时创建一个示例数据集,用调用替换整个#region/#endregionGet-Content
  • 设置想要的模式
  • 设置不需要的模式
  • 使用链式正则表达式调用来排除不需要的,然后包括想要的
  • 将其分配给$Result集合
  • 在屏幕上显示

编码 ...

#region >>> fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
ERROR: Writing local file  (I want to be alerted to this)
ERROR: Opening local file  (I do not want to be alerted to this)
INFO: Some other thing
ERROR: Yet another thing
INFO: A thing that is wanted
WARNING: Something that may be wanted
'@ -split [System.Environment]::NewLine
#endregion >>> fake reading in a text file

$TargetPattern = 'error:'
$NotWantedPattern = ': opening local file'

$Result = $InStuff -notmatch $NotWantedPattern -match $TargetPattern

$Result
Run Code Online (Sandbox Code Playgroud)

输出 ...

ERROR: Writing local file  (I want to be alerted to this)
ERROR: Yet another thing
Run Code Online (Sandbox Code Playgroud)