我尝试了各种不同的组合,并查看了其他类似的帖子,但找不到答案。我有一个 .config 文件,我需要在搜索时排除文件中的注释,如下所示:
(Get-Content C:\Path\File.config -Raw) | Select-String '(<!--((?!-->)(.|\n))*-->)' -AllMatches
我也尝试过以下正则表达式:
(?smi)^\<!--.*?--\>?
这两个在 regex101 和 regex.net 上都可以使用,但在 Powershell 上根本不起作用。这是我的 .config 文件的样子:
Test
<!--<add name= />
<add name= />
<add name= />-->
<add name= />
<!--<add name= />
<add name= />-->
Test
Test
我已确保将 -Raw 与 get-content 一起使用,并尝试了 out-string。这些正则表达式在除 powershell 之外的任何地方都有效。非常感谢您的帮助
答案1
当 Powershell 内置有一个非常好的 XML 解析器时,为什么还要尝试使用 Regex 手动解析 XML?
要从现有 XML 文件中删除注释,请解析该文件,找到所有带有 XPath 表达式的注释,将其删除,然后保存该文件,如下所示:
$xml = [xml](Get-Content C:\Path\File.config)
# You might need to tweak the XPath expression for your file,
# but this works for me on a random .NET app.config
$comments = $xml.SelectNodes('descendant::comment()')
$comments | %{ $_.ParentNode.RemoveChild($_) | out-null }
$xml.Save('C:\Path\File-output.config')
但听起来,这对于你想要做的事情来说有些过度了。
我正在尝试输出不带任何注释的文件。然后,我将使用此不带注释的输出并使用此数据创建 csv。
在这种情况下,为什么不直接使用解析后的 XML 并忽略注释呢?使用上面示例中的第一行解析文件后,您就会得到一个完美的 XML 对象,其中包含您可以查询、操作和输出为 CSV 的所有数据。您不需要先导出没有注释的文件。
如果您需要帮助来了解如何在 Powershell 中处理 XML 数据,网上有成千上万篇文章可以提供帮助。Google 是您的好朋友。
答案2
(<!--((?!-->)(.|\r\n))*-->)
我使用 Windows 上的 Notepad++ 工作。
我相信\n
在某些操作系统和大多数网站上是必需的,但\r\n
在 Windows 上是必需的。显然,每个操作系统处理换行符的方式略有不同。
更新时间:2017/08/16 12:39
这似乎对我有用:(Get-Content C:\Path\File.config -Raw) | Select-String '(<!--((?!-->)(.|\n))*-->)' -AllMatches | ForEach { $_.Matches.Value }