2017年9月2日土曜日

【windowsのバッチコマンド】ファイルにある文字列をファイルを開かずに置換する方法

例えば、あるファイル「test.txt 」のなかにある「YYY.YYY.YYY.YYY」という文字列を「XXX.XXX.XXX.XXX」に変更したい場合、こういうバッチを作る。
このバッチをhenkan.batとします。

henkan.bat
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
@echo off

move test.txt test.txt.old
set infile=test.txt.old
set outfile=test.txt
set before1=YYY.YYY.YYY.YYY
set after1=XXX.XXX.XXX.XXX

type nul >%outfile%
 
setlocal enabledelayedexpansion
for /f "delims=" %%A in (%infile%) do (
    set line=%%A
    set line=!line:%before1%=%after1%!
    echo !line!>>%outfile%
)
endlocal

del test.txt.old
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

test.txt(返還前)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
YYY.YYY.YYY.YYY
aaaaaa
bbbbbb
YYY.YYY.YYY.YYY
xxxxxx
dddd
YYY.YYY.YYY.YYY
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

henkan.batを実行すると、test.txtはこうなります。

test.txt(返還後)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
XXX.XXX.XXX.XXX
aaaaaa
bbbbbb
XXX.XXX.XXX.XXX
xxxxxx
dddd
XXX.XXX.XXX.XXX
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

YYY.YYY.YYY.YYY」という文字列を「XXX.XXX.XXX.XXX」に変更されました。
他の文字列は変わらず。

1.  変換したい文字列が記載されているtest.txtをtest.txt.oldと名称変更します。
2.  test.txt.oldを、1行ずつ読み込みます。
3.  読み込んだ1行にYYY.YYY.YYY.YYY」という文字列があれば「XXX.XXX.XXX.XXX」に置換して、test.txtに出力します。
4.  test.txt.oldの終わりまでループします。


元ファイルに空行がある場合は、変換後のファイルに空行が無くなってしまうので、そこは改善すべき点です。

置換したい文字列が複数あれば、その分変数を増やすなり配列で持たせればいいと思います。


★技術的な話
setlocal enabledelayedexpansionというのは、遅延環境変数を有効にするために記載しています。

for /f "delims="で、test.txtを1行ずつ読み込んでそれを、%%Aに入れています。

%%Aをline変数に入れ、
set line=!line:%before1%=%after1%!で、YYY.YYY.YYY.YYY」という文字列を「XXX.XXX.XXX.XXX」に置換しています。

0 件のコメント:

コメントを投稿