我有一个简单的文本文件,我需要一个powershell脚本来替换文件内容的某些部分。
我目前的脚本如下:
$content = Get-Content -path "Input.json"
$content -Replace '"(\d+),(\d{1,})"', '$1.$2' | Out-File "output.json"
是否可以在没有内容变量的情况下将其写入一行?
Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | Out-File "output.json"
我不知道如何在没有$ content变量的情况下在第二个命令中使用第一个get-content命令行开关的输出?是否有自动PowerShell变量
是否可以在管道中进行更多替换。
Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | ??? -Replace 'second regex', 'second replacement' | Out-File "output.json"
答案 0 :(得分:47)
是的,您可以在一行中执行此操作,甚至不需要管道,因为-replace
可以像您期望的那样在数组上工作(并且您可以链接运算符):
(Get-Content Input.json) `
-replace '"(\d+),(\d{1,})"', '$1.$2' `
-replace 'second regex', 'second replacement' |
Out-File output.json
(为了便于阅读,添加了换行符。)
围绕Get-Content
调用的括号是必要的,以防止-replace
运算符被解释为Get-Content
的参数。
答案 1 :(得分:8)
是否可以在没有内容变量的情况下将其写入一行?
是:使用ForEach-Object
(或其别名%
),然后使用$_
来引用管道上的对象:
Get-Content -path "Input.json" | % { $_ -Replace '"(\d+),(\d{1,})"', '$1.$2' } | Out-File "output.json"
是否可以在管道中进行更多替换。
是
Foreach-Object
段。当-replace
返回结果时,它们可以链接在一个表达式中:
($_ -replace $a,$b) -replace $c,$d
我怀疑不需要括号,但我认为它们更容易阅读:清楚 不止一些链式运算符(特别是如果匹配/替换是非平凡的)将会 不清楚。