さて、これをしばらく見てから、ワンライナーでこれを行う方法が必要だと思いました。ここにあります:
(gc "c:\myfile.txt") | % -Begin {$test = (gc "c:\myfile.txt" | select -first 1 -last 1)} -Process {if ( $_ -eq $test[0] -or $_ -eq $test[-1] ) { $_ -replace "-" } else { $_ }} | Set-Content "c:\myfile.txt"
これが行っていることの内訳は次のとおりです。
まず、今ではおなじみのエイリアス。コマンドがそのままで十分な長さであるため、これらを挿入するだけです。これにより、管理しやすくなります。
gc
意味Get-Content
%
意味Foreach
$_
現在のパイプライン値用です(これはエイリアスではありませんが、新しいと言ったので定義すると思いました)
さて、これがこれで起こっていることです:
(gc "c:\myfile.txt") |
->のコンテンツを取得し、c:\myfile.txt
それを送信します
%
-> foreachループを実行します(パイプライン内の各アイテムを個別に通過します)
-Begin {$test = (gc "c:\myfile.txt" | select -first 1 -last 1)}
->これは開始ブロックであり、パイプラインに入る前にここですべてを実行します。c:\myfile.txt
の最初と最後の行を配列にロードしているので、最初と最後の項目を確認できます
-Process {if ( $_ -eq $test[0] -or $_ -eq $test[-1] )
->これにより、パイプライン内の各アイテムのチェックが実行され、ファイル内の最初のアイテムか最後のアイテムかがチェックされます。
{ $_ -replace "-" } else { $_ }
->最初または最後の場合は置換を行い、そうでない場合はそのままにします
| Set-Content "c:\myfile.txt"
->これにより、新しい値がファイルに戻されます。
これらの各アイテムの詳細については、次のサイトを参照してください。
Get-Contentは
Get-Content定義を使用します
ForeachForeach
のパイプラインの
開始と処理の部分(これは通常カスタム関数用ですが、foreachループでも機能します)
If...elseステートメント
Set-Content
それで、これを多くのファイルに対して実行したい場合、またはこれを頻繁に実行したい場合はどうなるかを考えていました。私はあなたが求めていることを実行する関数を作ることにしました。関数は次のとおりです。
function Replace-FirstLast {
[CmdletBinding()]
param(
[Parameter( `
Position=0, `
Mandatory=$true)]
[String]$File,
[Parameter( `
Position=1, `
Mandatory=$true)]
[ValidateNotNull()]
[regex]$Regex,
[Parameter( `
position=2, `
Mandatory=$false)]
[string]$ReplaceWith=""
)
Begin {
$lines = Get-Content $File
} #end begin
Process {
foreach ($line in $lines) {
if ( $line -eq $lines[0] ) {
$lines[0] = $line -replace $Regex,$ReplaceWith
} #end if
if ( $line -eq $lines[-1] ) {
$lines[-1] = $line -replace $Regex,$ReplaceWith
}
} #end foreach
}#End process
end {
$lines | Set-Content $File
}#end end
} #end function
これにより、。というコマンドが作成されReplace-FirstLast
ます。それはこのように呼ばれるでしょう:
Replace-FirstLast -File "C:\myfiles.txt" -Regex "-" -ReplaceWith "NewText"
はオプションです。-Replacewith
空白の場合は削除されます(デフォルト値は""
)。は-Regex
、コマンドに一致する正規表現を探しています。これをプロファイルに配置する方法については、この記事を確認してください
注意: ファイルが非常に大きい場合(数GB)、これは最善の解決策ではありません。これにより、ファイル全体がメモリ内に存在し、他の問題が発生する可能性があります。