我已经尝试了各种不同的组合,已经检查了其他类似的post,但找不到我的答案。 我有一个.config文件,当我执行search时,我需要从文件中排除注释,如下所示:
(Get-Content C:\Path\File.config -Raw) | Select-String '(<!--((?!-->)(.|\n))*-->)' -AllMatches
我也尝试了下面的正则expression式:
(?smi)^\<!--.*?--\>?
这两个工作在regex101和regex.net上,但对Powershell完全不起作用。 这是我的.config文件的外观:
Test <!--<add name= /> <add name= /> <add name= />--> <add name= /> <!--<add name= /> <add name= />--> Test Test
我已经确定我正在使用我的获取内容 – 也尝试了外串。 除了powershell之外,这些正则expression式都可以工作。 你的帮助是适当的赞赏
当Powershell内置完美的XMLparsing器时,为什么要使用Regex手动parsingXML?
要从现有XML文件中删除注释,请parsing文件,使用XPathexpression式查找所有注释,将其删除,然后像下面这样保存文件:
$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')
但是,这听起来似乎甚至是你想要做的事情矫枉过正。
我正在尝试输出文件没有任何意见。 然后,我将使用这个输出没有评论,并使用这些数据创build一个csv。
在这种情况下,为什么不直接玩parsing的XML,只是忽略注释。 一旦你使用上面的例子中的第一行parsing了文件,就可以得到一个完美的XML对象,其中包含所有可以查询,处理和输出为CSV的数据。 您不应该先导出没有评论的文件。
如果您需要一些帮助来了解如何在Powershell中使用XML数据,那么可以从网上find数以千计的文章。 Google在这里是你的朋友。
(<!--((?!-->)(.|\r\n))*-->)在Windows上使用Notepad ++。
我相信\n在某些操作系统和大多数网站上都是必需的,但在Windows上需要\r\n 。 显然,每个操作系统对换行符的处理方式略有不同。
更新:2017/08/16 12:39
这似乎适用于我:( (Get-Content C:\Path\File.config -Raw) | Select-String '(<!--((?!-->)(.|\n))*-->)' -AllMatches | ForEach { $_.Matches.Value } (Get-Content C:\Path\File.config -Raw) | Select-String '(<!--((?!-->)(.|\n))*-->)' -AllMatches | ForEach { $_.Matches.Value }