Findstr:批处理以查找两个固定字符之间的字符串(所有行)

时间:2014-06-16 06:44:32

标签: windows string batch-file dos


我是DOS新手。事实上,我是一个Java人。我需要做一些字符串搜索操作,但不幸的是字符串搜索& java中的文件搜索操作相当慢。它的速度非常快。

所以这是我的问题。我需要搜索具有固定扩展名(.sp)的所有文件,用于2个固定字符之间的字符串(所有行)。他们是 ';' &安培; ';'

这是.sp文件之一的内容。 文件: - Tons.sp

line 1: Skipcheck;
line 2: [Scenario:'Actual']=STET;
line 3: ['WFS':'Actual','Scenario':'Actual','Measure':'Units']=N:
line 4: IF( SUBST( !Measure, 1, 1) @= '8'
line 5: ,
line 6:     ['Amount']
line 7: ,
line 8:    STET
line 9: );
line10: 
line11: ['Tons'] = N:
line12: DB('Volume Master',!Version,!Year,!Plant,'GL_CODE_0004',!Period,!Measure) ;
line13: 
line14: ['Group1_Volume'] = N:
line15: IF ( ELISANC( 'Plant', 'Group1' , !Plant )=1 
line16:     , ['Take_This']
line17:    , CONTINUE
line18: );
line19: 
line20: ['Tons Trend']=N:
line21: IF( DB('Monthly_Trend', !Period, 'Tons_Trend_Factor') > 0
line22: , 'Current_Tons' * DB('Volume Master',!Version,!Year,!Plant,'GL_CODE_TonsProduced',!Period,!Measure) 
line23: , CONTINUE
line24: );

请注意:行号仅供参考。

问题1:现在我需要找到位于';'之间的字符串(所有行) &安培; ';'包含字符串“DB('Volume Master'” ie。:findstring将是这样的: -

FINDSTR /n "=*DB('Volume Master'*;" *.sp

上述命令的结果应该是10到12行&第19至24行

line10: 
line11: ['Tons'] = N:
line12: DB('Volume Master',!Version,!Year,!Plant,'GL_CODE_0004',!Period,!Measure) ;

&安培;

line19: 
line20: ['Tons Trend']=N:
line21: IF( DB('Monthly_Trend', !Period, 'Tons_Trend_Factor') > 0
line22: , 'Current_Tons' * DB('Volume Master',!Version,!Year,!Plant,'GL_CODE_TonsProduced',!Period,!Measure) 
line23: , CONTINUE
line24: );


问题2:此输出: -

FINDSTR /n "=*DB('Volume Master'*'GL_CODE_TonsProduced'*;" *.sp

应该是: -

line19: 
line20: ['Tons Trend']=N:
line21: IF( DB('Monthly_Trend', !Period, 'Tons_Trend_Factor') > 0
line22: , 'Current_Tons' * DB('Volume Master',!Version,!Year,!Plant,'GL_CODE_TonsProduced',!Period,!Measure) 
line23: , CONTINUE
line24: );

请帮忙。

感谢
克里希纳

1 个答案:

答案 0 :(得分:0)

@ECHO Off
SETLOCAL
SET "destdir=U:\destdir"

SET "target=DB('Volume Master'"
SET "target=DB('Volume Master'.*'GL_CODE_TonsProduced'"
SET "blockend=;"
DEL  "%destdir%\res*" 2>nul
FOR /f "delims=" %%a IN (q24237940.txt) DO (
 >>"%destdir%\res.tmp" ECHO(%%a
 ECHO(%%a|FINDSTR /l /c:"%blockend%">NUL
 IF NOT ERRORLEVEL 1 (
  FINDSTR /r /c:"%target%" "%destdir%\res.tmp" >NUL
  IF NOT ERRORLEVEL 1 TYPE "%destdir%\res.tmp" >>"%destdir%\res.txt"
  DEL "%destdir%\res.tmp" /F /Q
 )
)

GOTO :EOF

我使用了一个名为q24237940.txt的文件,其中包含我的测试数据。

为方便起见,我使用了变量; destdir包含结果文件的目标目录,target表示必须在块内发生的目标字符串,blockend表示字符串结尾的字符串。

请注意,我在代码中保留了两个目标,后一个将被使用。 findstr逐行查找,因此在此示例中,DB...GL_CODE...必须出现在同一行。由于findstr尝试使用正则表达式,.*表示any number of any character - 其中characer集不包含换行符。

本质上,一次创建包含块的res.tmp,当找到块结束时,检测该tempfile是否包含魔术字符串;如果有,请附加到res.txt