1

同じディレクトリに歌詞のテキスト ファイルがあり、次のルールに従っていくつかの行を削除したいと考えています。

A.角かっこ[]を含むすべての行を削除します

B. 上から空でない 3 行を削除します。

C. 下部から空でない 2 行を削除します。

たとえば、このようなコマンド ラインは、複数のファイルに対して (A) を実行するように修正されるのでしょうか?

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

ギルバート

4

1 に答える 1

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 になります。

結果に満足している場合はrem、最後の 2 行の先頭から を削除すると、元のファイルが変更されたバージョンで上書きされます。この変更を行う場合は、スクリプトを 1 回だけ実行してください。

最初の FIND は行数のカウントを取得するため、行番号に基づいて下から削除する行がわかります。

興味深い点は、2 番目の FOR ループの大きな長いコマンドです。最初の FINDSTR は、各行の先頭に行番号を付けます。次に、これらの結果は 2 番目の FINDSTR にパイプされ、要件の理解に基づいて適切な行が削除されます。

正規表現を使用しています。たとえば、「^1:」は行頭の「1:」を検索する正規表現です。

遅延展開を使用せずに現在の値にアクセスできるように、2 倍のパーセントが bottom1 と bottom2 に使用されます。親バッチ内で %%bottom1%% は %bottom1% になり、FINDSTR コマンドに渡されます。FOR /F IN() 句のコマンドは、独自の CMD セッション内で実行されるため、%bottom1% の現在の値を適切に拡張できます。

/v オプションが使用されているため、FINDSTR はどの正規表現検索文字列とも一致しないすべての行を保持します。この点で、あなたは正しい道を歩んでいました。1 つの FINDSTR ですべてのフィルタリングを行う方が効率的です。

FOR /F オプションは、各行を 2 つのトークンに分割するように設定され、各行の最初の : で分割されます。2 番目のトークンのみが印刷されます。これが、行番号のプレフィックスが出力から取り除かれる方法です。

于 2012-01-09T23:19:06.047 に答える