如何用正则表达式与PowerShell修改YAML指定section下的width值
需求:修改YAML中指定Section的width值
YAML示例内容
position: height: 100 width: 200 2position: width: 200 height: 100
需要实现:仅修改position节点下的width值,不影响2position节点,且节点内部的键(比如height、width)顺序可能任意,用PowerShell结合正则表达式完成。
之前尝试的问题
使用了以下正则替换逻辑:
-replace '(?m)(?<=position:)([^[]*width:)(.+?)$','$1 400'
该正则会错误替换文件中最后一个width值,没有正确限定仅在position节点范围内匹配。
正确实现方案
使用以下正则表达式配合PowerShell,精准匹配position:节点下的width行:
(Get-Content -Path "yourfile.yaml" -Raw) -replace '(?ms)(^position:\s*\n)(.*?)(^\s*width:)\s*\d+', '$1$2$3 400' | Set-Content -Path "yourfile.yaml"
正则逻辑说明:
(?ms):开启多行模式(m)和单行模式(s),让.能匹配换行符,^匹配每行开头(^position:\s*\n):匹配开头的position:行,捕获为分组1(.*?):非贪婪匹配position:之后到下一个width:之前的所有内容(包括换行和缩进),捕获为分组2(^\s*width:):匹配position节点下的width:行(带任意缩进),捕获为分组3\s*\d+:匹配width:后的空白和数字值- 替换为
$1$2$3 400:保留原结构,仅把width值改为400
注意事项
- 确保YAML中
position节点是顶级节点,且节点结束于下一个顶级节点(比如2position:),该正则会自动停止在第一个后续顶级节点前,不会影响其他节点。 - 如果
position节点是最后一个顶级节点,也能正常匹配,因为非贪婪匹配会到文件结尾。
内容的提问来源于stack exchange,提问作者Enz8642
相关产品推荐
相关产品推荐

