2012-01-09 8 views
1

私はこれらの規則に従って、いくつかの行を削除したいのと同じディレクトリに、歌詞のテキストファイルを、持っている:削除テキストの先頭からの行または

A.削除を角括弧を含むすべての行[]

B.上から3つの空でない行を削除します。 C.下部から2つの空でない行を削除します。

たとえば、このようなコマンドラインを複数のファイルに対してdo(A)に固定することはできますか?

type *.txt | findstr /v LYRICS | findstr /v "[" | findstr /v "]" >*.txt 

ギルバート

+0

空の行を保持する必要がありますか? 1行目が空の場合はどうなりますか?最初の3行は削除しないといけませんか?最後の2つの空でない行と同じタイプの質問ですか? – dbenham

答えて

1

主な編集 - 私は私のコードをテストし、デバッグ。多くのバグがありました。

私はこれがあなたに近づくはずだと思います。しかし、私はあなたの空でない状態を理解しているかどうかまだ分かりません。

このコードは、現在のディレクトリ内のすべての.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番目のトークンだけが印刷されます。これは、行番号接頭辞が出力から取り除かれる方法です。

+0

素早く答えてくれたdbenhamに感謝します。 "<この時点では予期しなかった>"というメッセージで失敗するようです。 原因は何だと思いますか? **出力:** 「C:\ TMP \ Test1と> test1の C:\ TMP \ Test1と> SETLOCAL enableDelayedExpansion <この時点では予想外でした。 C:\ tmp \ Test1> '/ find' v '' <'' ')の場合、/ f%Nの場合do bottom1 =%N C:\ tmp \ Test1>' – Gilbert

+0

もちろんIN()節のリダイレクトをエスケープするのを忘れてしまった。これは上記で修正されています。 – dbenham

+0

私はそれがうまくいっていないのではないかと心配です。 C:\ tmp \ Test1> setlocal enableDelayedExpansion |この時点で予期せぬことでした。 C:\ tmp \ Test1> 'findstr/n "^" "%F" | findstr/vr/c: "\ ["/c: "\]"/c: "^^ 1:"/c: "^^ 2:"/c: "^^ 3:"/c: "^^ !bottom1 !: "/ c:" ^^!bottom2 !: "' C:\ tmp \ Test1> – Gilbert

関連する問題