2017-08-14 60 views
2

我有一个配置文件,我需要输出一些文本并将其转换为CSV文件。我被困在第一步,即这个文件有很少的HTML注释被排除,其余的文本将被用于导出到CSV目的。Powershell从文本文件中排除HTML注释

HTML注释看起来像以下:

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

我已经尝试了不同的正则表达式的解决这个问题,但没有运气。我已经得到的最接近是排除使用下面的正则表达式的第一和第三行,但作为二线仍然存在,不解决这个问题:

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

此正则表达式将采取哪些行开头,但不是评论的一部分。我有多个评论文件。

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

你的帮助是及时赞赏,感谢

回答

2

在您需要处理<!--永远是在该行的开始和-->末的文件?如果是这样,那么你可能需要获取内容,并通过一个循环来运行它,在这个循环中,你逐行处理文档,切换内容的状态变量。

[email protected]" 
<!--<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 
+0

非常感谢您的回复已选中此。试过,但没有运气: $ data = Get-Content C:\ file.conf $ state ='content' $ data -split“'n”|对于每个对象{ }如果($ _ -match'^ <! - '){$ 状态=' 评论” 回报$空 } 如果($ _ -match ' - > $'){$ 状态= '内容' 回报$空 } 如果($ state -eq'content'){ $ _ } } – user3421341

+0

当您尝试使用实际内容时会发生什么?你是否收到错误,输出中是否包含评论,或其他内容?我的回答大多是这个想法的一个例子,但并不意味着它是一个成品。你几乎肯定会需要调整一些东西。 – Zoredache

1

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

  • 为了有几行正则表达式匹配,你必须得到原 内容

然后,你需要指定一个正则表达式的选择跨线终结匹配,即reference

  • S ingleLine模式(。匹配任何字符,包括换行符),以及
  • M ultiline mode(^和$ match embedde d线终止符),例如
  • (SMI) - 注意,“我”是i gnore情况下
  • ?有一个ungreedy匹配,否则一个注释的开始可以在最后注释的结尾匹配。

(Get-Content .\config.html -raw) -replace '(?smi)^\<!--.*?--\>?' 

Regex101

+0

感谢您的回复。我试过了,它对我没有用。它按原样返回文件。我非常感谢你的详细回复@LotPings – user3421341

+0

对不起,我在我的测试中粘贴了错误的版本,只是删除了RegEx末尾的'$'。我会相应地编辑答案。 – LotPings

+0

谢谢,但这不适合我。我试图从最后取消美元,但它仍然没有做任何事情。 – user3421341