我正在尝试读取一个文本文件,不管是什么语言......
$x = [IO.File]::ReadAllText("__init__.py")
...查找字符串
$pattern = [regex] '(?s)(?:ExportSTL.+?global_scale = .+?default=)(.+?),'
...并将捕获组((.+?)
)替换为另一个字符串(例如10.0
)。然后写入文件并关闭它。
我如何才能获取捕获组,以便可以就地修改它并保存文件?我所有的尝试都用非捕获组替换整个匹配的行。
答案1
尝试积极回顾组而不是非捕获组:
$pattern = [regex] '(?s)(?<=ExportSTL.+?global_scale = .+?default=)(.+?),'
后视组将被要求匹配,但它不会消耗任何字符。
替换字符串将只是'10.0'
。
一种不太奇特的方法是将非捕获组转变为普通组:
$pattern = [regex] '(?s)(ExportSTL.+?global_scale = .+?default=)(.+?),'
替换字符串将是'${1}10.0'
(带单引号)。 代表${1}
第一组。(您需要在“1”周围加上花括号,这样它就不会碰到“10.0”。)
答案2
解决方案
谢谢@dangph,这是采纳了他的建议的脚本。
$x = [IO.File]::ReadAllText("__init__.py")
# Turned the non-capturing group into a normal group
$pattern = [regex] '(?s)(ExportSTL.+?global_scale = .+?default=)(.+?),'
# Put $1 in curly brackets, and added literal comma at end of replacement
$x -replace $pattern, '${1}10.0,' | Set-Content .\__init__.py