如何在for循环中格式化find-replace变量

时间:2013-08-04 04:02:36

标签: windows batch-file

我有这个脚本:

setlocal EnableDelayedExpansion
set SECTION=dispid 3
set TARGET=pushscope
@echo on
for /F "tokens=1* delims=:" %%a in ('findstr /N /C:"%SECTION%" /C:"%TARGET%" %CHECKER%') do (
    if not defined StartSection (
        if not %%b==%%b:%SECTION%=% set StartSection=%%a
    ) else (
    goto :EOF
        if not defined TargetLine (
            goto :EOF :: Do nothing yet
            if not %%b equ !%%b:%TARGET%=! set TargetLine=%%a& goto checkercont
        )
    )
)

在StartSection(问题区域)中,我尝试进行查找和替换以确认此行是我想要的行,并保存该行号。

如何编写它以便正确解析变量并正确查找和替换?

我尝试了什么。 " [%B]"表示替换的%% b:

%%b:%SECTION%=% returns "[%b]:dispid 3=a" (Yes, it somehow gives me an 'a').
!%b:%SECTION%=! returns "!SECTIONa"
!%%b:%SECTION%=! returns "![%b]:dispid 3=!" (which then gives me an error saying 3 is not a command)
!%b:%SECTION%=%! returns "!SECTION!"
!%%b:!SECTION!=! returns "![%b]:!SECTION!=!"
%b:%%SECTION%%=% return "dispid 3" (and error)

我觉得最后一个它解析粗体然后斜体。的%B:% %SECTION%的 %=% 并使用!似乎永远不会完成任何事情,除了至少有一个回到我身边。

是的,稍等一点之后我就开始在那里投掷随机垃圾(感到沮丧)。

那么正确的方法是什么?

由于

3 个答案:

答案 0 :(得分:3)

试试这个:

@ECHO OFF &SETLOCAL
for /F "delims=:" %%a in ('findstr /N /C:"%SECTION%" "%CHECKER%"') do if not DEFINED StartSection set "StartSection=%%a"
IF NOT DEFINED StartSection (ECHO StartSection %section% NOT found&goto:eof)
for /F "delims=:" %%a in ('MORE +%StartSection% "%CHECKER%" ^|findstr /N /C:"%TARGET%"') do if not DEFINED TargetLine set "TargetLine=%%a"
ECHO StartSection at line #%StartSection%
IF NOT DEFINED TargetLine (ECHO TargetLine %target% NOT found) ELSE ECHO TargetLine at line #%TargetLine%

答案 1 :(得分:1)

对不起。我想我不明白你试图通过这条线实现的目标:

if not %%b==%%b:%SECTION%=% set StartSection=%%a

您必须意识到%%b包含从文件中读取的,而不是变量!让我们分析一下这个例子:

!%%b:%SECTION%=!

如果%%b包含变量的名称,则前一行将从中消除SECTION的值。但是,%%b不包含变量的名称,而是从文件中读取

如果你想检查从文件中读取的行是否包含SECTION给出的字符串,那么你应该这样做:

setlocal EnableDelayedExpansion
set SECTION=dispid 3
set TARGET=pushscope
@echo on
for /F "tokens=1* delims=:" %%a in ('findstr /N /C:"%SECTION%" /C:"%TARGET%" %CHECKER%') do (
    if not defined StartSection (
        set "line=%%b"
        if not "!line!" == "!line:%SECTION%=!" set StartSection=%%a
    ) else (
. . .

答案 2 :(得分:0)

关于SO的最难回答的问题是"This doesn't work - how do I fix it?"问题 - 对于所需要的唯一线索是OP承认不起作用的构造......完全按照要求完成淘汰了'水晶球 - 现在维修成本真的吃掉了蝙蝠的翅膀和蜥蜴的舌头预算......

我真的无法弄清楚对双重反转的痴迷是什么。为什么if not condition thingtwo else thingone ?? if condition thingone else thingtwo有什么问题?也许我只是过时了 - 但也许它在政治上是不正确的或以某种荒谬的方式具有歧视性。

所以 - 在正在审查的情况下,假设期望的结果是确定第一个dispid 3的亚麻布以及在pushscope之后出现的包含dispid 3的行的亚麻布文件%checker%(其中未提供样本......)

@ECHO OFF
SETLOCAL
set SECTION=dispid 3
set TARGET=pushscope
SET checker=sourcefile.txt
SET startsection=
SET targetline=
for /F "tokens=1* delims=:" %%a in ('findstr /N /C:"%SECTION%" /C:"%TARGET%" %CHECKER%') do (
 IF DEFINED startsection (
  IF NOT DEFINED targetline (
    ECHO %%b|FIND "%target%">NUL
    IF NOT ERRORLEVEL 1 SET targetline=%%a
  )
 ) ELSE (
  ECHO %%b|FIND "%section%">NUL
  IF NOT ERRORLEVEL 1 SET startsection=%%a
 )
)

ECHO startsection=%startsection% targetline=%targetline%

GOTO :EOF

哪个适合我。 YMMV。