2

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

第 1 行:!FILE_FORMAT=ADS

第 2 行:!VERSION=1.0

.

.

LineX: '父|子|IsPrimary| * ***(该行以 ' 开头并且很长)

.

.

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

.

.

线Z。

我想提取 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
4

3 回答 3

3
@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

使用您熟悉的方法 - 我已更改源和目​​标目录/文件名以适合我的系统。不确定是否要包含两个目标行 - 只需更改geqgtr和/或更改leqlss取决于要排除的行(如果有)。

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


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

于 2013-08-06T07:19:27.047 回答
2

您可以使用 sed for Windows 执行此操作:

sed "/'Parent|Child|IsPrimary|/,/!PropertyArray=Cost Center/!d" file1 > file2
于 2013-08-06T04:44:47.757 回答
1

findrepl.bat这使用从 - http://www.dostips.com/forum/viewtopic.php?f=3&t=4697调用的帮助程序批处理文件

type file.txt |findrepl "^'Parent\|Child\|IsPrimary\|" /e:"^!PropertyArray=Cost" |findrepl /v "^!PropertyArray=Cost">newfile.txt

术语^开头的 表示它从第一列开始。你看到的\||角色的逃逸。

于 2013-08-06T06:53:58.707 回答