Manipulação de texto no powershell [fechado]

1

Sou novo no script do powershell, mas consegui reunir algumas linhas de código mostradas abaixo.

$input_path = 'C:\Users\ND04805\Documents_Projects_IP21_Graphics_update\graphic_xml.xml'
$output_file = 'C:\Users\ND04805\Documents_Projects_IP21_Graphics_update\tags.txt'
$regex1 = '\btag="[A-Za-z_0-9]+\b"'
select-string -Path $input_path -Pattern $regex1 -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file
$regex2 = 'tag="[A-Za-z]_'
$(Get-content $output_file) -replace $regex2,'' | set-content $output_file
$(Get-content $output_file) -replace '_','(' | set-content $output_file 
$(Get-content $output_file) -replace '"',')' | set-content $output_file

Arquivo de entrada

Arquivo de saída

dc(1730)
DC(2103)
dc(2416)
DC(2018)
DC(2017)
dc(2026)
dc(2070)
DC(2071)
dc(2100)
dc(2101)
dc(2440)
ac(2773)
ac(2763)
dc(2416)
ac(2829)
dc(2440)
ac(2859)
ac(2879)
ac(2880)
tag=)()

Objetivo do código

Eu tenho um arquivo XML (graphic_xml.xml) que representa um gráfico de processo no formato XML. Existe uma string tag="x_yy_nnnn que é interessante e eu preciso extrair o mesmo deste arquivo XML.

onde

  • x e y são alfabetos [a-zA-Z]
  • nnnn é um número de 4 dígitos

Depois de extrair a tag que parece com tag="x_yy_nnnn" , eu quero me livrar da parte tag="x_ e mudar o material restante para que a tag pareça com essa CG yy(nnnn) .

Trabalhando

O regex1 selecionará a tag do arquivo XML e a transmitirá para o arquivo de saída usando o cmdlet select-string .

Eu coloquei alguns textos de substituição feios que substituem o conteúdo do arquivo de saída em cada passagem

Pergunta

Eu gostaria de saber como isso pode ser feito de forma mais eficaz e correta. Por exemplo, não consigo adicionar o CG<space> no início de cada linha do arquivo. Como isso pode ser feito?

Atualizar

Alterei a última linha de $(Get-content $output_file) -replace '"',')' | set-content $output_file
para $(Get-content $output_file) -replace '"',')' | Foreach-object {"CG $_"} | set-content $output_file
e recebi a string CG anexada ao início de cada linha

    
por Prasanna 19.04.2017 / 18:40

1 resposta

2

Com um RegEx mais complexo, não é tão difícil:

$input_path = '.\graphic_xml.xml'
$output_file = '.\tags.txt'

[RegEx]$Pattern = '(?smi)^.*tag="[A-Z]_([A-Z]{2})_(\d{4}).*$'

Select-String -Path $input_path  -Pattern $Pattern -AllMatches | 
  ForEach-Object { 
    "CG $($_.Matches.Groups[1].Value)($($_.Matches.Groups[2].Value))"
  } | Set-Content $output_file

Exemplo de saída:

> Get-Content .\tags.txt |select -first 15
CG dc(1730)
CG DC(2103)
CG dc(2416)
CG DC(2018)
CG DC(2017)
CG dc(2026)
CG dc(2070)
CG DC(2071)
CG dc(2100)
CG dc(2101)
CG dc(2440)
CG ac(2773)
CG ac(2763)
CG dc(2416)
CG ac(2829)

Você pode jogar com os parâmetros RegEx aqui

    
por 19.04.2017 / 20:37