Если опция 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 предложил, а не просто перезаписать файл с новым содержанием.
Существует компромисс. Если вы знаете, что, скорее всего, файлы будут иметь SearchTerm, может быть лучше запустить временный файл, копирующий содержимое другого файла по мере его поступления. Вместо поиска в файле дважды. – grepsedawk 2008-12-04 22:17:58