web-dev-qa-db-ja.com

PowerShellの正規表現でテキストファイルの内容を置き換えます

単純なテキストファイルがあり、ファイルコンテンツの一部を置き換えるためのPowerShellスクリプトが必要です。

私の現在のスクリプトは次のとおりです。

$content = Get-Content -path "Input.json"

$content -Replace '"(\d+),(\d{1,})"', '$1.$2' |  Out-File "output.json"

このように、コンテンツ変数なしで1行で書くことは可能ですか?

Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' |  Out-File "output.json"

$ content変数なしで2番目のコマンドで最初のget-contentコマンドレットの出力を使用する方法がわかりませんか?自動PowerShell変数はありますか

パイプラインでの交換よりも多くの交換を行うことは可能ですか?.

Get-Content -path "Input.json" | ??? -Replace '"(\d+),(\d{1,})"', '$1.$2' | ??? -Replace 'second regex', 'second replacement' |  Out-File "output.json"
35
Jan Baer

はい、-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への引数として解釈されるのを防ぐために必要です。

52
Joey

このように、コンテンツ変数なしで1行で書くことは可能ですか?

はい: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
    

    括弧は不要だと思いますが、読みやすくするためだと思います:連鎖演算子(特に一致/置換が自明でない場合)よりも明らかに多いとは限りません。

10
Richard