, чтобы объяснить предложение Сквошмана:
@echo off
setlocal enabledelayedexpansion
set "input_list=list.txt"
set "string=kkklllmmm"
set "output_list=output.txt"
(for /f "delims=" %%# in (%input_list%) do (
REM if current line is your searchstring, then echo the previous line:
if "%%#"=="%string%" echo !line!
REM set the variable to the current line:
set "line=%%#"
)) > "%output_list%"
Примечание: я использовал пустой разделитель, чтобы прочитать всю строку.Если вы намеренно использовали :
по какой-то причине (кроме «некоторого символа, которого нет в файле для чтения всей строки»), просто переопределите его.
Редактировать:
How did you get the previous line?
путем установки переменной line
после сравнения %%#
(текущая строка), поэтому при каждом повороте цикла в конце line
- текущая строка, нона следующем ходу в начале это будет «предыдущая линия» (и станет «текущей линией» только в конце хода)
I need to find more than one string
: немного сложнее: добавить секундуfor
для обработки каждой строки поиска.Обратите внимание на синтаксис строки set "string=..."
.Также для обработки строк с пробелами этот синтаксис является обязательным.(если бы не было пробелов, это упростило бы до set "string=string1 string2 string3")
, но для обработки пробелов каждая подстрока тоже должна быть заключена в кавычки:
set "string="string 1" "string 2" "string 3""
)
@echo off
setlocal enabledelayedexpansion
set "input_list=list.txt"
set "string="kkklllmmm" "xxx / yyy / zzz""
set "output_list=output.txt"
(for /f "delims=:" %%# in (%input_list%) do (
for %%a in (%string%) do (
echo %%#|findstr /xc:%%a >nul && echo !line!
)
set "line=%%#"
)) > "%output_list%"
Внешний for
(%%#
) получает по одной строке за раз.
Внутренний for
обрабатывает каждую подстроку в списке за раз.
Следующая строка echo
проверяет строку и пытается найти подстроку (переключатели
x
= сравнить всю строку,
c
= найти буквенную строку (включая пробелы, иначе он попытается найти каждое слово в строке, например, xxx
, /
,yyy
и т. Д.)
&&
выполняет команду echo !line!
только в случае успешного выполнения предыдущей команды (findstr
найдено совпадение)