1

Я новичок в сценариях powershell, но мне удалось собрать несколько строк кода, показанных ниже.

$input_path = 'C:\Users\ND04805\Documents\1_Projects\10_IP21_Graphics_update\graphic_xml.xml'
$output_file = 'C:\Users\ND04805\Documents\1_Projects\10_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

Входной файл

Выходной файл

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=)()

Кодекс Цель

У меня есть файл XML (graphic_xml.xml), который отображает графику процесса в формате XML. Существует строка tag="x_yy_nnnn которая представляет интерес, и мне нужно извлечь ее из этого XML-файла.

где

  • x и y - алфавиты [a-zA-Z]
  • nnnn - это четырехзначное число

После извлечения тега, который выглядит как tag="x_yy_nnnn" , я хочу избавиться от tag="x_ part и изменить оставшийся материал так, чтобы тег выглядел как CG yy(nnnn) .

За работой

Regex1 выберет тег из файла XML и передаст его в выходной файл с помощью командлета select-string .

Я вставил несколько уродливых текстов замены, которые заменяют содержимое выходного файла при каждом проходе.

Вопрос

Я хотел бы знать, как это можно сделать более эффективно и правильно. Например, я не могу добавить CG<space> в начале каждой строки файла. Как это может быть сделано?

Обновить

Я изменил последнюю строку с
$(Get-content $output_file) -replace '"',')' | set-content $output_file
в
$(Get-content $output_file) -replace '"',')' | Foreach-object {"CG $_"} | set-content $output_file
и получил строку CG добавленную в начало каждой строки

1 ответ1

2

С более сложным RegEx это не так сложно:

$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

Образец вывода:

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

Вы можете поиграть с параметрами RegEx здесь

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .