题
我有一个小实用程序,可以搜索许多文件。我必须创建它,因为Google和Windows桌面搜索都没有在文件中找到适当的行。搜索效果很好(我愿意改进它),但是我想添加到util的一件事是批次查找/替换。
那么,如何从文件中读取行,将其与搜索词进行比较以及是否通过,然后更新线并继续通过文件的其余部分进行比较?
解决方案
我会为每个文件做以下内容:
- 正常进行搜索。还要检查是否要替换令牌。一旦看到它,请重新开始该文件。如果您看不到要替换的令牌,那就完成了。
- 重新开始时,创建一个新文件,然后复制您从输入文件中读取的每一行,在进行时进行替换。
- 完成文件后:
- 将当前文件移至备份文件名
- 将新文件移至原始文件名
- 删除备份文件
请注意,您不要在二进制文件等上进行此操作 - 进行文本搜索并替换二进制文件的后果通常会很可怕!
其他提示
如果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
还支持REGEX比赛,但已限制为简单的匹配项,以简单地;)您还可以执行更强大的替代品 乔恩 建议,而不仅仅是用新内容覆盖文件。
不隶属于 StackOverflow