我有一个小实用程序可以搜索多个文件。我不得不创建它,因为Google和& Windows桌面搜索未找到文件中的相应行。搜索工作正常(我愿意改进)但我想添加到我的util中的一件事是批量查找/替换。
那么如何从文件中读取一行,将其与搜索词进行比较,如果它通过,然后更新该行,并继续浏览文件的其余部分,该怎么办呢?
答案 0 :(得分:2)
我会为每个文件执行以下操作:
请注意,不要在二进制文件等上执行此操作 - 进行文本搜索和替换二进制文件的后果通常是可怕的!
答案 1 :(得分:0)
如果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建议,而不是仅覆盖文件新内容。