用powershell中的正则表达式替换文本文件的内容

时间:2013-04-27 09:04:39

标签: regex powershell

我有一个简单的文本文件,我需要一个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"

2 个答案:

答案 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"
  

是否可以在管道中进行更多替换。

  1. 如上所述:只需添加更多Foreach-Object段。
  2. -replace返回结果时,它们可以链接在一个表达式中:

    ($_ -replace $a,$b) -replace $c,$d
    

    我怀疑不需要括号,但我认为它们更容易阅读:清楚 不止一些链式运算符(特别是如果匹配/替换是非平凡的)将会 不清楚。