2017-08-14 65 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