grep 結果から元ファイルの内容を差し替える

grep 結果の各行の内容を差し替える。
grep 結果(Input.txt)
D:\work\A.cpp(15): エラー01
D:\work\A.cpp(20): エラー02
D:\work\B.txt(3): エラー101
変更後の grep 結果(Input.txt)
D:\work\A.cpp(15): エラー(01)
D:\work\A.cpp(20): 警告(02)
D:\work\B.txt(3): エラー(201)
.PS1 を実行
.\GrepReplace Input.txt
GrepReplace.ps1
Param( [IO.FileInfo] $file, [Switch] $check )
if( $file -eq $Null )
{
"grep 結果の内容を書き換え、このコマンドレットに渡すことで各行を置換する`n"
"書式"
"gReplace <ファイル・パス> [-check]`n"
"-check 指定すると置換はせず、置換する行を確認する`n"
return
}
if( (Test-Path $file) -eq $False )
{
"指定されたファイルが見つかりません`n"
return
}
Function gReplace
{
Begin
{
$wk = @{ lineDst = $Null; fileDst = "" }
$wk.OutputFile = `
{
try
{
$wk.lineDst | Out-File $wk.fileDst default
}
catch
{
$wk.fileDst
"`t出力できません"
}
}.GetNewClosure()
if( $check.IsPresent )
{
$fn = `
{
Param( $line, $file, $lineNumber, $text )
"--------------------------------------------------------------------------------"
$file
$lineNumber
$text
}.GetNewClosure()
}
else
{
$fn = `
{
Param( $line, $file, $lineNumber, $text )
if( $wk.fileDst -ne $file )
{
if( $wk.fileDst -ne "" )
{
& $wk.OutputFile
}
$wk.fileDst = $file
$wk.lineDst = Get-Content $file
}
$i = [int]$lineNumber - 1
if( ($i -ge 1) -band ($i -le $wk.lineDst.Length) )
{
$wk.lineDst[ $i ] = $text
}
else
{
$line
"`t行数が範囲外です"
}
}.GetNewClosure()
}
}
End
{
if( $check.IsPresent -eq $False )
{
& $wk.OutputFile
}
}
Process
{
if( $_ -match "^[\t ]*([C-Z]:(?:\\[^\\]+)*(?:\\[^\\]+))\(([0-9]+)\): (.+)$" )
{
$m = $Matches
& $fn $_ $m[1] $m[2] $m[3]
}
}
}
Get-Content $file | gReplace