Как найти и заменить текст в текстовом файле Windows с помощью поиска и замены строк, которые легко читаются и которые легко добавлять / изменять / удалять.Этот сценарий проанализирует 6800-строчный файл, найдет 70 экземпляров строк, перенумерует их и перезапишет оригинал менее чем за 400 мс.
Поиск строк "AROUND LINE {1-9999}" и "LINE2{1-9999} "и замените {1-9999} на {номер строки}, в котором включен код.Вокруг струн есть ведущее и замыкающее пространство.Последние два теста выполняются со всей исходной пакетной копией и вставляются в sample.bat.
sample.bat содержит две строки:
ECHO AROUND LINE 5936
TITLE %TIME% DISPLAY TCP-IP SETTINGS LINE2 5937
текущий код включает поиск AROUND LINE и @mklement0 solution.:
copy-item $env:temp\sample.bat -d $env:temp\sample.bat.$((get-date).tostring("HHmmss"))
$file = "$env:temp\sample.bat"
$lc = 0
$updatedLines = switch -Regex ([IO.File]::ReadAllLines($file)) {
'^(.*? (?:AROUND LINE|LINE2) )\d+(.*)$' { $Matches[1] + ++$lc + $Matches[2] }
default { ++$lc; $_ }
}
[IO.File]::WriteAllLines($file, $updatedLines, [Text.Encoding]::ASCII)
Ожидаемые результаты:
ECHO AROUND LINE 1
TITLE %TIME% DISPLAY TCP-IP SETTINGS LINE2 2
Фактические результаты:
ECHO AROUND LINE 1
TITLE %TIME% DISPLAY TCP-IP SETTINGS LINE2 2
Измерение с использованием коммутатора, каркасов .NET и всего вставленного пакетного файлаinto sample.bat:
Measure-command {
copy-item $env:temp\sample.bat -d $env:temp\sample.bat.$((get-date).tostring("HHmmss"))
$file = "$env:temp\sample.bat"
$lc = 0
$updatedLines = switch -Regex ([IO.File]::ReadAllLines($file)) {
'^(.*? (?:AROUND LINE|LINE2) )\d+(.*)$' { $Matches[1] + ++$lc + $Matches[2] }
default { ++$lc; $_ }
}
[IO.File]::WriteAllLines($file, $updatedLines, [Text.Encoding]::ASCII)}
Результаты: 75 мс-386 мс за десять прогонов.
Измерьте, используя Get-Content + -replace + Set-Content и весь пакетный файл, вставленный в образец.bat:
Measure-command {
copy-item $env:temp\sample.bat -d $env:temp\sample.bat.$((get-date).tostring("HHmmss"))
(gc $env:temp\sample.bat) | foreach -Begin {$lc = 1} -Process {
$_ -replace 'AROUND LINE \d+', "AROUND LINE $lc" -replace 'LINE2 \d+', "LINE2 $lc"
++$lc
} | sc -Encoding Ascii $env:temp\sample.bat}
Результаты: 363ms-451ms за десять запусков.
Строка поиска - это простое для понимания регулярное выражение.
Вы можете искать дополнительные строки, добавив еще один -relace.
-replace 'AROUND LINE \d+', "AROUND LINE $lc" -replace 'LINE2 \d+', "LINE2 $lc" -replace 'LINE3 \d+', "LINE3 $lc"
Примечание редактора : Это следующеевопрос до Выполните итерацию резервного текстового файла ascii, найдите все экземпляры {LINE2 1-9999} и замените на {LINE2 "номер строки, в которой находится код".Перезапись.Быстрее?
Эволюция этого вопроса от младшего к старшему: 1. 54757890 2. 54737787 3. 54712715 4. 54682186
Обновление : я использовал решение регулярных выражений @ mklement0.