我有一个文本文件,想要使用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
答案 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
条款开头的^
表示它从第一列开始。您看到的\|
是|
字符的转义。