2013-03-21 2 views
1

Я пытаюсь использовать петлю for за findstr. Я хочу сделать var6 строку WHOLE, которая находится выше найденной строки Class=!var4!. Я положил skip=-1, но это не сработает (посмотреть назад на одну линию).Получить строку, которая появляется перед соответствующей строкой

Так что, если это выглядит следующим образом:

Name=Bismark #14 
Class=var4 

Я хотел бы var6 = Name = Bismarck # 14

findstr /b "Class=!var4!" "PosTime_Campaign_SCR.mis" 
if not errorlevel 1 (
for /f "skip=-1 delims=" %%L in ('findstr "Class=!var4!" PosTime_Campaign_SCR.mis') do (
if not errorlevel 1 (
set var6=!var6!%%L 
) 
) 
) 

Я близко, но я не знаю, как сказать for петля, чтобы посмотреть одну строку выше найденной строки findstr.

Решение:

@echo off 

set var4=BBBismarck 

for /f "delims=" %%L in (PosTime_Campaign_SCR.mis) do (
if /i "%%L" equ "Class=%var4%" (
    goto endloop 
) 
set "var6=%%L" 
) 
    :endloop 

echo %var6% 
pause 

ответ

2

Это будет трудно использовать findstr для этой работы.

Я вижу один подход: использовать /N вариант так findstr выписывает номер строки, а затем использовать этот номер строки в другом цикле, где вы обрабатываете одну линию, в то время файла и установить var6 к предыдущей строке.

Но если вы все равно перебираете все строки в файле, вам может быть лучше пропустить findstr и просто делать ваши собственные сравнения. Или используя findstr на каждой строке.

Вот некоторые совершенно непроверенный код, чтобы описать то, что я себе:

for /f %%L in (PosTime_Campaign_SCR.mis) do (
    if /i "%%L" equ "Class=%var4%" (
     goto endloop 
    ) 
    set "var6=%%L" 
) 
:endloop 

echo %var6% 

Что мы делаем здесь, установка var6 в каждой строке, но когда мы достигаем линию мы хотим, чтобы мы пропускаем из ряда петля. Поэтому var6 заканчивается установкой значения предыдущей строки.

+0

Привет, там. Почти есть. Он возвращает часть строки выше, но не всю строку. Строки могут содержать пробелы. Таким образом, с кодом, который вы предоставили, и моим примером, он будет возвращать только «Name = Bismark», а не 'Name = Bismark # 14' –

+0

очень умный и простой код. Это тоже быстро. Но как включить пробелы и специальные символы, как # на линии? –

+0

исправлено. Благодаря вам. –

0
(set var6=) 
for /f "delims=" %%L in (PosTime_Campaign_SCR.mis) do IF NOT DEFINED var6 (
echo %%L | findstr "Class=!var4!" >nul 
if not errorlevel 1 (set var6=!lastline!) 
set lastline=%%L 
) 

... при условии, что Class = var4 никогда не появится в первой строке файла.

lastline содержит содержимое последней строки, прочитанной. Когда FINDSTR обнаруживает совпадающую строку, var6 устанавливается на содержимое предыдущей строки, и, поскольку var6 теперь задан в среде, проверка не повторяется, поэтому он устанавливает var6 в содержимое строки до FIRST соответствующей строки ,

Если вы удалите IF NOT DEFINED var6, тогда var6 будет соответствовать содержимому строки до линии LAST.

и если var6 не определено после выполнения, не было подходящей линии.

Смежные вопросы