powershell - powershell中的文本操作

powershell - powershell中的文本操作

我是 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 参数在这里

相关内容