获取匹配行之前出现的行

时间:2013-03-21 19:11:34

标签: batch-file cmd

我正试图在for结果上使用findstr循环。我想让var6成为找到字符串Class=!var4!之上的WHOLE行。我放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 个答案:

答案 0 :(得分: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最终被设置为上一行的值。

答案 1 :(得分: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将设置为最后一个匹配行之前的行内容。

如果var6在执行后未定义,则没有匹配的行。