批处理脚本以提取两个指定行之间的行

时间:2013-08-06 00:04:22

标签: batch-file scripting extract lines

我有一个文本文件,想要使用Windows批处理脚本提取两条指定行之间的所有行。

第1行:!FILE_FORMAT = ADS

Line2:!VERSION = 1.0

LineX:'Parent | Child | IsPrimary | * *** (该行以'并且很长)

LineY:!PropertyArray =成本中心(行以!开头)

LineZ。

我想提取LineX和LineY之间的所有行,并将其输出到另一个文件。

以下代码正确找到起始行。但它只是删除了我希望停止脚本并输出文件其余部分的行(行Y)。

输出是从X行到Z行而没有Y行。

@for /f "tokens=1 delims=[]" %%a in ('find /n "'Parent|Child"^<D:\DEV\Test\Cost_Center.txt') do @(
more +%%a D:\DEV\Test\Cost_Center.txt |find /v "!PropertyArray=Cost Center" || goto :eof)>D:\DEV\Test\Cost_Center_Out.txt

3 个答案:

答案 0 :(得分:2)

你可以用sed for Windows做到这一点:

sed "/'Parent|Child|IsPrimary|/,/!PropertyArray=Cost Center/!d" file1 > file2

答案 1 :(得分:2)

@ECHO OFF
SETLOCAL 
SET "sourcedir=c:\sourcedir"
SET "destdir=c:\destdir"
for /f "tokens=1 delims=[]" %%a in ('find /n "'Parent|Child"^<"%sourcedir%\Cost_Center.txt" ') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "!PropertyArray=Cost Center"^<"%sourcedir%\Cost_Center.txt" ') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%sourcedir%\Cost_Center.txt" ') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>"%destdir%\newfile.txt"
GOTO :EOF

使用您熟悉的方法 - 我已经更改了源和目标目录/文件名以适合我的系统。不确定是否要包含两个目标行 - 只需将geq更改为gtr和/或leq更改为lss,具体取决于哪些(如果有),你想要排除。

如果您包含一些示例数据,可能会更容易......


编辑20130807T0207Z ECHO变为ECHO(以应对空行。

答案 2 :(得分:1)

这使用了来自 - http://www.dostips.com/forum/viewtopic.php?f=3&t=4697

的名为findrepl.bat的帮助程序批处理文件
type file.txt |findrepl "^'Parent\|Child\|IsPrimary\|" /e:"^!PropertyArray=Cost" |findrepl /v "^!PropertyArray=Cost">newfile.txt

条款开头的^表示它从第一列开始。您看到的\||字符的转义。