2

テキスト ファイルがあり、Windows バッチ スクリプトを使用して、指定された 2 つの行の間のすべての行を抽出したいと考えています。

Line1: !FILE_FORMAT=ADS

Line2: !VERSION=1.0

.

.

LineX: '親|子|IsPrimary| * *** (' で始まる行が長い)

.

.

LineY: !PropertyArray=Cost Center (!で始まる行)

.

.

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

あなたが慣れているアプローチを使用して、ソースと宛先のディレクトリ/ファイル名をシステムに合わせて変更しました。2 つのターゲット行を含めるかどうかは不明です。除外したい行がある場合は、それに応じて、および/またはに変更geqするだけです。gtrleqlss

いくつかのサンプルデータを含めた方が簡単だったかもしれません...


edit 20130807T0207ZECHOECHO(空行対応になりました。

于 2013-08-06T07:19:27.047 に答える
2

これは、Windows 用の sed で実行できます。

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

これは、 http://www.dostips.com/forum/viewtopic.php?f=findrepl.bat 3&t=4697から呼び出されるヘルパー バッチ ファイルを使用します。

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

用語の^最初の は、1 列目から始まることを意味します。あなたが見るのは、キャラクター\|のエスケープです。|

于 2013-08-06T06:53:58.707 に答える