O Regex funciona em todos os lugares (tentou regex101 e regstorm.net) exceto Powershell

1

Eu tentei vários combos diferentes e já verifiquei outros posts semelhantes, mas não consigo encontrar minha resposta. Eu tenho um arquivo .config e preciso excluir os comentários do arquivo quando faço minha pesquisa, algo como abaixo:

(Get-Content C:\Path\File.config -Raw) | Select-String  '(<!--((?!-->)(.|\n))*-->)'  -AllMatches

Eu também tentei o regex abaixo:

(?smi)^\<!--.*?--\>?

Ambos funcionam em regex101 e regex.net, mas não funcionam com o Powershell. É assim que meu arquivo .config se parece:

Test

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

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

Test
Test

Eu me certifiquei de que estou usando o -Raw com meu conteúdo de conteúdo e também testei o resultado. Esses regex funcionam em todos os lugares, exceto o powershell. Sua ajuda é devidamente apreciada

    
por nav 15.08.2017 / 19:59

2 respostas

2

Por que você está tentando analisar XML manualmente usando o Regex quando o Powershell tem um analisador XML perfeitamente bom embutido?

Para remover comentários de um arquivo XML existente, analise o arquivo, localize todos os comentários com uma expressão XPath, remova-os e salve o arquivo de volta assim:

$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')

Mas parece que até isso é um exagero para o que você está tentando fazer.

I am trying to output the file without any comments. Then, I will play with this output without comments and create a csv using this data.

Nesse caso, por que não apenas brincar com o XML analisado diretamente e simplesmente ignorar os comentários. Depois de analisar o arquivo usando a primeira linha do exemplo acima, você tem um objeto XML perfeitamente bom com todos os dados que pode consultar, manipular e gerar como CSV. Você não precisa exportar o arquivo sem comentários primeiro.

Se você precisar de alguma ajuda para descobrir como trabalhar com dados XML no Powershell, existem literalmente milhares de artigos on-line que podem ajudar. O Google é seu amigo aqui.

    
por 16.08.2017 / 17:37
1

(<!--((?!-->)(.|\r\n))*-->) funcionou no Notepad ++ no Windows para mim.

Acredito que \n é necessário em determinados sistemas operacionais e na maioria dos sites, mas \r\n é necessário no Windows. Aparentemente, cada sistema operacional lida com novas linhas de maneira ligeiramente diferente.

Atualização: 2017/08/16 12:39

Isso pareceu funcionar para mim: (Get-Content C:\Path\File.config -Raw) | Select-String '(<!--((?!-->)(.|\n))*-->)' -AllMatches | ForEach { $_.Matches.Value }

    
por 15.08.2017 / 20:53