2013-08-06 26 views
1

我有一個文本文件,並希望使用windows批處理腳本提取兩條指定行之間的所有行。批處理腳本提取兩條指定行之間的行

線路1:FILE_FORMAT = ADS

線路2: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

是否還有其他以'or!開頭的行? ?這些行號是否改變? – 2013-08-06 00:17:25

+0

行內有引號嗎?當你說線路「很長」時,你的意思是什麼? –

回答

2

用sed可以爲Windows做到這一點:

sed "/'Parent|Child|IsPrimary|/,/!PropertyArray=Cost Center/!d" file1 > file2 
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 

^在第術語的開始意味着它從第一列開始。你看到的\|就是|角色的逃跑。

+0

謝謝。有用。但它也包含「!PropertyArray = Cost」行。 – user1492218

+0

立即嘗試。我添加了一個過濾器來刪除該行。 – foxidrive

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和/或leqlss,這取決於您要排除哪些(如果有的話)。

就會容易得多,如果你包含了一些樣本數據...


編輯20130807T0207Z ECHO變得ECHO(應對空行。

+0

謝謝。很棒。但是我得到了「ECHO關閉」這一行。在文件的末尾。 – user1492218

+0

我修改了代碼 - 這個改變非常微妙 - 'ECHO'變成了'ECHO('。這會發生在空行上,'%% b'沒有被設置,因此被解釋爲一個空字符串。 – Magoo