我将其用作批处理文件中的 Powershell 命令的一部分来替换另一个文件中的文本:
-replace 'contrast=.*? -b:v', 'contrast=.*?,fps=%FRAMERATE% -b:v'
被修改的文件可能有一个特定的对比值,如下所示:
contrast=1.03
如果我尝试使用如上所示的通配符.*?
,它不会保留 1.03 值进行对比,而只是用文字通配符替换它,因此我最终得到contrast=.*?
修改后的文件。
对比度值可能会改变。有什么方法可以告诉 Powershell,无论替换命令第一部分的值是什么,它都需要在下一部分保持不变?
有人说把它放在方括号中(因为它在批处理文件中,所以需要转义)但是这不起作用,如下所示:
-replace 'contrast=/[.*?/] -b:v', 'contrast=/[.*?/],fps=%FRAMERATE% -b:v'
所做的只是在修改后的文件中给我以下内容:contrast=/[.*?/]
我确信存在一些奇怪的组合或方法可以做到这一点,我只是不知道如何做。
在此先感谢任何可以对此作出阐释的人。
答案1
你可以!-replace
支持使用捕获组,并自动将它们设置为变量$1
、$2
等,您可以使用:
# Example input text
$text = 'contrast=1.03 -b:v
contrast=2.34 -b:v
contrast=6.66 -b:v'
$text -replace '(.*?) -b:v', '$1,fps=%FRAMERATE% -b:v'
# Output:
contrast=1.03,fps=%FRAMERATE% -b:v
contrast=2.34,fps=%FRAMERATE% -b:v
contrast=6.66,fps=%FRAMERATE% -b:v
$1
不是 powershell 变量,因此$
替换字符串中必须是文字。如果您确实想在正则表达式中使用变量,请确保对其进行转义:
$text -replace '(.*?) -b:v', "`$1,fps=$framerate -b:v"
请参阅“使用捕获组替换”部分SS64查看更多示例。