首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取出现在匹配行之前的行

获取出现在匹配行之前的行
EN

Stack Overflow用户
提问于 2013-03-22 03:11:34
回答 2查看 1K关注 0票数 1

我尝试在findstr结果上使用for循环。我想把发现的字符串Class=!var4!上面的整行代码都设为var6。我放入了skip=-1,但这不起作用(向后看一行)。

因此,如果它看起来像这样:

代码语言:javascript
复制
Name=Bismark #14
Class=var4

我想要var6 = Name=Bismarck #14

代码语言:javascript
复制
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字符串的上方一行。

解决方案:

代码语言:javascript
复制
@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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-22 03:40:46

使用findstr来完成这项工作将会很困难。

我可以看到一种方法:使用/N选项,以便findstr写出行号,然后在另一个循环中使用行号,在该循环中,您一次处理文件的一行,并将var6设置为前一行。

但是,如果您无论如何都要遍历文件中的每一行,那么最好完全跳过findstr,只做您自己的比较。或者在每一行上使用findstr

这里有一些完全未经测试的代码来描述我正在想象的东西:

代码语言:javascript
复制
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最终被设置为前一行的值。

票数 2
EN

Stack Overflow用户

发布于 2013-03-22 03:42:25

代码语言:javascript
复制
(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
)

...assuming指出Class=var4永远不能出现在文件的第一行。

lastline保存最后读取的行的内容。当FINDSTR检测到匹配行时,将var6设置为读取的前一行的内容,并且由于现在在环境中设置了var6,因此不重复检查,因此它将var6设置为第一个匹配行之前的行的内容。

如果删除IF NOT DEFINED var6,那么var6将被设置为最后一个匹配行之前的行的内容。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15556145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档