我有一个Powershell脚本,我试图通过格式不佳的XML文件来查找任何节点,其中“Date”作为节点名称的一部分。即。
<System><SystemName>Acme</Systemname><SystemDate>313</SystemDate><SystemNumber>3</SystemNumber><FileDate>394</FileDate></System>
上述模式在文件中重复了数百次...大约70MB的数据。
真实文件有更多的节点,没有换行或任何东西......所以它们都出现在一行上。
我需要做的是扫描文件并查找以“Date”结尾的任何节点,其中值不是4位数,并替换为4位数值。
这是我到目前为止所做的......但看起来替换只是改变第一次出现而不是第一场比赛后的所有其他比赛。
使用上面的示例,它应该找到结束</SystemDate>
和关闭</FileDate>
节点,并看到该数字只有3个字符,并替换为9999。
$infile=get-content z:\system.txt
write-host $infile.Length
$regex = New-Object System.Text.RegularExpressions.Regex ">\d\d\d</(.*Date)"
$replace = $regex.Replace($infile,"9999")
write-host $infile.Length
write-host $replace.Length
set-content -Value $replace z:\new_system.txt
任何帮助将不胜感激!
答案 0 :(得分:1)
(我认为你的代码过于简化......例如,你可能想说$regex.Replace($infile,">9999</$1")
)
暂且不说,我要做的第一件事就是让匹配的正则表达式更精确:">\d\d\d</([^>]*Date)"
...我假设PowerShell的正则表达式实现与其他实现一样贪婪。这可能会马上解决问题。
如果没有,我认为自然要做的就是绕过Matches。但是Replace方法声称要全部替换它们,所以我认为应该可以避免这种情况。
答案 1 :(得分:0)
$xmlDocument = [XML](get-content z:\system.txt)
执行XML样式