从文本文件中排除HTML注释

时间:2017-08-14 21:29:48

标签: powershell html

我有一个配置文件,我需要从中输出一些文本并将其转换为CSV。我陷入了第一步,即该文件几乎没有HTML注释要被排除,剩下的文本将用于导出到CSV目的。

HTML评论如下所示:

<!--<add name=                                />
    <add name=                                />
    <add name=                                />-->

我尝试过不同的正则表达式来解决这个问题,但没有运气。我最接近的是使用下面的正则表达式排除第一行和第三行,但这并不能解决问题,因为第二行仍然存在:

Get-Content –Path C:\Pathtothefile -notmatch "^\s*(<!--)|>*(-->)$"

这个正则表达式将取出以评论的一部分开头的行,但不是中间的行。我有多个文件有多个评论。

尝试了几种不同的组合("<!--[^>]*(-->)$"),到目前为止没有运气。

2 个答案:

答案 0 :(得分:2)

在您需要处理的文档中,<!--始终位于行的开头,最后是-->?如果是这样,那么您可能需要获取内容,并通过循环运行它,您可以逐行处理文档,切换内容的状态变量。

$data=@"
<!--<add name=                                />
    <add name=                                />
    <add name=                                />-->
a,b,c,d
1,2,3,4
"@
$state='content'
$data  -split "`n" |
ForEach-Object {
  If ($_ -match '^<!--') {
    $state='comment'
    return $null  # because `continue` doesn't work in a foreach-object
  }
  If ($_ -match '-->$') {
    $state='content'
    return $null
  }
  If ($state -eq 'content') {
    $_
  }
}

结果

a,b,c,d
1,2,3,4

答案 1 :(得分:1)

不知道配置文件的内容,尽管有jscott's提示。

  • 要使RegEx匹配多行,您必须获得原始 含量

然后你需要指定一个正则表达式选项来匹配行终止符,即reference

  • S ingleLine模式(。匹配包括换行符在内的任何字符),以及
  • M ultiline模式(^和$匹配嵌入式行终止符),例如
  • (?smi) - 注意“i”是i gnore case
  • ?有一个不合适的匹配,否则一条评论的开头可能会与最后一条评论的结尾相匹配。
(Get-Content .\config.html -raw) -replace '(?smi)^\<!--.*?--\>?'

Regex101

上查看此内容