主な編集 - 私は私のコードをテストし、デバッグ。多くのバグがありました。
私はこれがあなたに近づくはずだと思います。しかし、私はあなたの空でない状態を理解しているかどうかまだ分かりません。
このコードは、現在のディレクトリ内のすべての.TXTファイルを変更します。各ファイルについて、最初の3行、最後の2行、[または]を含む行を削除する必要があります。最初の行の:で始まる行は、先頭行が削除されます。書かれたよう
@echo off
for %%F in (*.txt) do (
for /f %%N in ('find /c /v "" ^<"%%F"') do set bottom1=%%N
set /a bottom2=bottom1-1
(
for /f "tokens=1* delims=:" %%A in (
'findstr /n "^" "%%F" ^| findstr /vr /c:"\[" /c:"\]" /c:"^1:" /c:"^2:" /c:"^3:" /c:"^%%bottom1%%:" /c:"^%%bottom2%%:"'
) do echo(%%B
)>"%%~nF.mod"
rem del "%%F"
rem ren "%%~nF.mod" "%%~nxF"
)
、元のファイルが保存され、修正されたバージョンは、同じ名前を持つことになりますが、の.mod拡張子を持ちます。
結果に問題がなければ、最後の2行の先頭からrem
を削除して元のファイルを修正したバージョンで上書きします。この変更を行った場合は、スクリプトを1回だけ実行してください。
最初のFINDは行数のカウントを取得するので、行番号に基づいて下から削除する行がわかります。
興味深いビットは、2番目のFORループのbig longコマンドです。最初のFINDSTRは各行の前に行番号を付けます。これらの結果は、必要に応じて適切な行を削除する2番目のFINDSTRにパイプされます。
正規表現を使用します。たとえば、 "^ 1:"は行頭で "1:"を探す正規表現です。
遅延倍率を使用せずに現在の値にアクセスできるように、倍率はbottom1とbottom2に使用されます。親バッチの%% bottom1 %%は%bottom1%になり、FINDSTRコマンドに渡されます。 FOR/F IN()句のコマンドは、独自のCMDセッション内で実行されるため、%bottom1%の現在の値を適切に拡張することができます。
/vオプションが使用されているため、FINDSTRはすべての正規表現検索文字列と一致しないすべての行を保持します。あなたはこの点で正しい方向にいました。 1つのFINDSTRですべてのフィルタ処理を行うほうが効率的です。
FOR/Fオプションは、各行を2つのトークンに分割するように設定されています。 2番目のトークンだけが印刷されます。これは、行番号接頭辞が出力から取り除かれる方法です。
空の行を保持する必要がありますか? 1行目が空の場合はどうなりますか?最初の3行は削除しないといけませんか?最後の2つの空でない行と同じタイプの質問ですか? – dbenham