我需要使用 PowerShell 5.1 读取文件、对其进行编辑,并将结果写入另一个文件。我一直在研究https://stackoverflow.com/questions/45540444/grep-and-sed-not-working-in-powershell并且能够将那里的信息调整为接近我想要的内容,目前内容如下:
PowerShell -ExecutionPolicy Bypass -Command "(Get-Content $$source_file -Raw) -replace 'AAA','BBB' | Out-File -filepath output_file"
这可行,但我有两个问题尚未找到答案:
- 因为上面的指令是 Makefile 中配方的一部分,而 Makefile 必须使用 cmd.exe 作为其 shell(否则我只会使用 sed),所以我需要按原样措辞指令,即使用实际的 PowerShell 命令作为两个双引号之间的字符串传递。使用单引号括住 -replace 参数的值是可行的,但在实际问题中,我需要传递变量,因此我必须使用双引号,以便可以扩展变量引用。我在其他地方读到,要在 powershell 指令中包含双引号,只需连续使用两个双引号,但当我这样做时,我收到一条错误消息,提示我必须在运算符后使用值表达式
-replace
。
这是不起作用的版本:
PowerShell -ExecutionPolicy Bypass -Command "(Get-Content $$source_file -Raw) -replace ""AAA"",""BBB"" | Out-File -filepath output_file"
所以我的第一个问题是,如何在值表达式中包含一个变量名,以便将其扩展为其真实值?
我的第二个问题是,我需要对文件进行多次编辑。由于-replace
操作员似乎与 Get-Content 命令行程序绑定,因此我尝试了以下操作:
PowerShell -ExecutionPolicy Bypass -Command "(Get-Content $$source_file -Raw) -replace 'AAA','BBB' -replace 'CCC','DDD' | Out-File -filepath output_file"
第二个表达式的存在-replace
引发了错误异常。因此,如果我需要在将最终版本写回文件系统之前动态地对源文件进行几次编辑,除了每次编辑时再次通过新的 Get-Content 管道发送整个文件之外,还有什么简单的方法可以做到这一点?
谢谢。
答案1
这将有助于您查看所遇到的错误。
这里它在 cmd 窗口中进行两次替换。
或者您可以尝试该.replace('AAA','BBB')
方法。
> type test.txt
blah AAA
Blubb CCC
> PowerShell -ExecutionPolicy Bypass -C "(Get-Content .\test.txt -Raw) -replace 'AAA','BBB' -replace 'CCC','DDD' "
blah BBB
Blubb DDD
> PowerShell -ExecutionPolicy Bypass -C "(Get-Content .\test.txt -Raw).replace('AAA','BBB').replace('CCC','DDD')"
blah BBB
Blubb DDD