多数のファイルを検索する小さなユーティリティがあります。Google と Windows の両方のデスクトップ検索でファイル内の適切な行が見つからなかったため、作成する必要がありました。検索は問題なく動作します (改善したいと思っています) が、util に追加したい機能の 1 つは、バッチ検索/置換です。
では、ファイルから行を読み取り、それを検索用語と比較し、合格した場合は行を更新し、ファイルの残りの部分を続行するにはどうすればよいでしょうか?
多数のファイルを検索する小さなユーティリティがあります。Google と Windows の両方のデスクトップ検索でファイル内の適切な行が見つからなかったため、作成する必要がありました。検索は問題なく動作します (改善したいと思っています) が、util に追加したい機能の 1 つは、バッチ検索/置換です。
では、ファイルから行を読み取り、それを検索用語と比較し、合格した場合は行を更新し、ファイルの残りの部分を続行するにはどうすればよいでしょうか?
各ファイルに対して次のことを行います。
ただし、バイナリ ファイルなどではこれを行わないように注意してください。バイナリ ファイルでテキストの検索と置換を行うと、通常、悲惨な結果になります。
PowerShell がオプションの場合、以下に定義されている関数を使用して、複数のファイルの検索と置換を実行できます。たとえば'a string'
、現在のディレクトリ内のテキスト ファイルを検索するには、次のようにします。
dir *.txt | FindReplace 'a string'
別の値に置き換える'a string'
には、最後に新しい値を追加します。
dir *.txt | FindReplace 'a string' 'replacement string'
を使用して、単一のファイルで呼び出すこともできますFindReplace -path MyFile.txt 'a string'
。
function FindReplace( [string]$search, [string]$replace, [string[]]$path ) {
# Include paths from pipeline input.
$path += @($input)
# Find all matches in the specified files.
$matches = Select-String -path $path -pattern $search -simpleMatch
# If replacement value was given, perform replacements.
if( $replace ) {
# Group matches by file path.
$matches | group -property Path | % {
$content = Get-Content $_.Name
# Replace all matching lines in current file.
foreach( $match in $_.Group ) {
$index = $match.LineNumber - 1
$line = $content[$index]
$updatedLine = $line -replace $search,$replace
$content[$index] = $updatedLine
# Update match with new line value.
$match | Add-Member NoteProperty UpdatedLine $updatedLine
}
# Update file content.
Set-Content $_.Name $content
}
}
# Return matches.
$matches
}
Select-String
正規表現の一致もサポートしていますが、簡単にするために単純な一致に制限されていることに注意してください;)ファイルを新しいコンテンツで上書きするだけでなく、Jonが提案したようなより堅牢な置換を実行することもできます.