我是 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 是一个 4 位数字
提取看起来像的标签后tag="x_yy_nnnn"
,我想摆脱该tag="x_
部分并更改剩余的内容,以便标签看起来像这样CG yy(nnnn)
。
在职的
regex1 将从 XML 文件中选择标签并使用 cmdlet 将其传递给输出文件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
使用更复杂的 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 参数在这里