2

大文字と小文字を区別する文字列を検索して置換したい

テキストファイルにrise Rise RISEがある場合のように、文字列「rise」のみを置き換えたい場合、以下のコードは3つの文字列すべてを置き換えます。

親切に私を助けてください!

@Echo on
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION

set file="c:\Users\rawal\Desktop\a\file.txt"
set /p Input=Enter some text:
set OldStr="rise"
set NewStr=%Input% 

for /f "tokens=1,* delims=]" %%A in ('"type %file% |find /n /v """') do (
set "line=%%B"
if defined line (
call echo %%line:%OldStr%=%NewStr%%%>> %file%_new
) ELSE echo.
)

move /Y %file%_new %file% > nul
4

3 に答える 3

1
@ECHO OFF
SETLOCAL
SET "old=rise"
SET "new=deflate"
DEL newfile.txt /F /Q
FOR /f "delims=" %%i IN ('type somefile.txt^|findstr /n "$" ') DO (
ECHO %%i
SET line=%%i
CALL :replace
)

FC somefile.txt newfile.txt

GOTO :eof

:REPLACE
:: first replace all characters up to the colon by nothing
SET line=%line:*:=%
SET "withreplacements="
:loop
IF NOT DEFINED line >>newfile.txt ECHO(%withreplacements%&GOTO :EOF 
ECHO %line%|FINDSTR /b /l /c:"%old%" >NUL
IF ERRORLEVEL 1 SET withreplacements=%withreplacements%%line:~0,1%&SET line=%line:~1%&GOTO loop
SET withreplacements=%withreplacements%%new%
SET remove=%old%
:loploop
IF DEFINED remove SET remove=%remove:~1%&SET line=%line:~1%&GOTO loploop
GOTO loop

比較的簡単な方法を次に示します。それは特定のキャラクターに著しく敏感で"^&|<>あり、問​​題である - おそらく他のいくつかのキャラクターも - しかし問題ないspace,;%!)(ようだ.

各行の先頭にFINDSTR配置するf を使用して番号を付けることにより、すべての行を読み取りますlinenumber :

そのプレフィックスは削除され、withreplacements行は文字ごとに 作成されます

  • replaceme行がターゲット文字列で始まるかどうかを確認します
  • 最初の文字が削除されない場合は、作成中の文字列の末尾に配置します
  • 一致する場合は、
    • 置換文字列を追加
    • 置換する文字列のコピーを作成します
    • コピー先文字列が空になるまで、ソース文字列とコピー先文字列の最初の文字を削除します

line元が空になるまで繰り返します

はい、遅いです。しかし、それは機能します。ちょっと。

改善提案を歓迎します。

于 2013-04-13T10:32:56.893 に答える
0

バッチ ファイルには複数の制限があるため、汎用的なソリューションを作成することは困難です。このため、私は常に、特定の問題の特定の要件を最初に満たそうとします。これが可能であれば、現在誰かから要求されていない他の同様の問題に対して、より一般的な解決策を提供するという Batch の制限は問題になりませんよね?

以下のバッチ ファイルは、大文字と小文字を区別して、ある文字列を別の文字列に置き換えます。これは非常に高速ですが、対象の文字列を含め、大文字と小文字の組み合わせが異なる複数回記述された元の文字列を含む行で失敗します。この要件を持つほとんどのユーザーにとって、この方法で十分だと思います。

@echo off
setlocal EnableDelayedExpansion

set /P "file=Enter file name: "
set /P "OldStr=Enter original text: "
set /P "NewStr=Enter new text: "

rem Get list of numbers of matching lines to replace
set n=0
for /F "delims=:" %%a in ('findstr /N /C:"%OldStr%" "%file%"') do (
   set /A n+=1
   set replace[!n!]=%%a
)
if %n% equ 0 (
   echo Original text not found in file
   goto :EOF
)
set /A n+=1
set replace[%n%]=0

rem Process all lines in the file
setlocal DisableDelayedExpansion
set i=1
(for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%file%"') do (
   set line=
   set "line=%%b"
   setlocal EnableDelayedExpansion
   rem If this line have the original string...
   for %%i in (!i!) do if %%a equ !replace[%%i]! (
      rem ... replace it and advance to next matching line number
      echo !line:%OldStr%=%NewStr%!
      endlocal & set /A i=%%i+1
   ) else (
      echo(!line!
      endlocal
   )
)) > "%file%_new.txt
rem If you want to replace the original file, remove REM from next line:
REM move /Y "%file%_new.txt" "%file%"

たとえば、この入力ファイルは次のとおりです。

This line is not changed: Rise. 
No problem with special characters: & | < > ! " ^ 
This line is changed: rise
This line is not changed: RISE
This line is incorrectly changed: Rise & rise

「rise」を「New Text」に置き換えると、次のようになります。

This line is not changed: Rise. 
No problem with special characters: & | < > ! " ^ 
This line is changed: New Text
This line is not changed: RISE
This line is incorrectly changed: New Text & New Text
于 2013-04-13T18:49:35.557 に答える