こんなことを知りたい人へ向けて書いています
- Windowsバッチファイルでファイル内の文字列を置換する方法を知りたい方
- ファイル内の文字列を置換する方法を知りたい方
- ファイル内の複数の文字列をいっぺんに置換したい方
目次
その他の関連しそうな記事
文字列を置換する
バッチファイル内で文字列を置換するには、
1 |
%[置換対象文字列]:[置き換えられる文字列]=[置き換え後の文字列]% |
とします。これで[置換対象文字列]で指定した文字列の中の[置き換えられる文字列]が[置き換え後の文字列]に置換されます。
例として、以下のバッチファイルは置換対象文字列「The woman’s name is ‘Risa’.」の「woman」を「girl」に置き換えています。
1 2 3 4 5 6 7 8 9 10 11 |
@echo off rem 置き換え前の文字列を変数「string」へ代入 set string=The woman's name is 'Risa'. rem 置換前の文字列を表示させてチェック echo 置換前:%string% rem 置き換え(woman -> girl) set replaced_string=%string:woman=girl% rem 置換後の文字列を表示させてチェック echo 置換後:%replaced_string% |
まず初めに4行目で「The woman’s name is ‘Risa’.」を変数「string」へ代入しています。6行目の「echo」コマンドは変数「string」の中身を表示させて置換前の文字列をチェックしています。
9行目のコマンドで、その中にある「woman」を「girl」に置き換え変数「replaced_string」に代入しています。「=」の右辺が、
1 |
%[置換対象文字列]:[置き換えられる文字列]=[置き換え後の文字列]% |
の形になっていることを確認できると思います。最後に最終行で置換後の文字列を表示させてチェックします。
以下が上記のバッチファイルの実行結果ですが、置換前と置換後の出力から、「woman」が「girl」に置き換わっていることが確認できます。
これが、バッチファイルで文字列を置換する方法です。次は、ファイル内の文字列を置換する方法を紹介します。
ファイル内の文字列を置換する
ファイル内の文字列を対象に置換操作を行う場合、前節の[置換対象文字列]を「for」コマンドを使って、ファイルから取得します。
「file.txt」に、
The woman’s name is ‘Risa’.
Tear is woman’s weapon.
と記述してあったとします。
このファイルの「woman」を「girl」に書き換えるバッチファイルは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
@echo off rem もし「file_replaced.txt」ファイルが既に存在している場合、削除しておく if exist file_replaced.txt del file_replaced.txt rem 以下の「for」ループ内で変数を変化させるための宣言 setlocal enabledelayedexpansion rem 「for」ループで「file.txt」ファイルの内容を1行ずつ取得し、 rem 「woman」を「girl」に置換する for /f "delims=" %%a in (file.txt) do ( rem 変数「line」にファイル内容を一行ずつ代入する set line=%%a rem 変数「line」内の「woman」を「girl」に置換し、 rem 「file_replaced.txt」ファイルに書き込む echo !line:woman=girl! >> file_replaced.txt ) endlocal |
まずは、このバッチファイルを実行して、出来上がった置換後のファイルを以下に示します。
「woman」が「girl」に置き換えられていることが分かります。
バッチファイルの内容に戻りましょう。7行目までのコマンドの解説は割愛します。コマンド内のコメントに書いてある通りです。
11行目から20行目の「for」ループ内で「file.txt」ファイルから文字列を一行ずつ読み込み、変数「line」に代入しています。※「for」コマンドを使ったファイル内の文字列の読み込みは「forループを使ってファイル内容を一行ずつ読み込み -やりたいことから検索-」を参考にしてください。
そして、「woman」を「girl」に変えて、「echo」コマンドでファイル「file_replace.txt」に出力しています。
「for」コマンドについての詳細な解説はここでは割愛しますが、「for」ループ内では変数を囲む「%」を「!」に変えていることに注意してください。「for」ループ内で使用する変数は「%」ではなく「!」を使うと覚えておきましょう。これらは「for文(繰り返し) -コマンド別解説-」や「forループの中で値を変化させる -やりたいことから検索-」に詳しく解説してありますので、こちらを参照して下さい。
注意するのは、18行目に「woman」を「girl」に置き換えた文字列変数「line」を「>>」を使ってファイルに追記している点です。ここに「>」を使ってしまうと、forループを回るたび、ファイルが上書きされてしまうので必ず「>>」の方を使います。これについては、「「>」と「>>」の違い -コラム-」を参照して下さい。
また、「>>」は前の文章に追記するコマンドですので、前のファイルが残っていては前の内容が残ってしまいます。なので、4行目でファイルがある場合にはファイルを削除するコマンドを記述しています。
ファイル内の複数の文字列を置換する
ファイル内容の複数の文字列を置換するには、一度「set」コマンドで変数「line」に文字列を置換したものを一時的に格納して次の置換に進む必要があります。「set」コマンドは変数に値や文字列を代入するために使用するコマンドであり、
1 |
set line=文字列 |
などとすると変数「line」に「文字列」という文字列を代入することができます。「set」コマンドについては「set(変数の設定・計算・ユーザーからの入力情報の取得) -コマンド別解説-」が詳しいです。
以下のバッチファイルプログラムは、「woman」を「girl」へ、「is」を「are」へ置換するものです。
woman → girl
is → are
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@echo off rem もし「file_replaced2.txt」ファイルが既に存在している場合、削除しておく if exist file_replaced2.txt del file_replaced2.txt rem 以下の「for」ループ内で変数を変化させるための宣言 setlocal enabledelayedexpansion rem 変数「line」内の「woman」を「girls」に置換、 rem また「is」を「are」に置換し、 rem 「file_replaced2.txt」ファイルに書き込む for /f "delims=" %%a in (file.txt) do ( set line=%%a set line=!line:woman=girl! set line=!line:is=are! echo !line! >> file_replaced2.txt ) endlocal |
13行目までは前節のバッチプログラムと同様です。14行目は「woman」を「girl」に変換していますが、変換後の文字列を「set」コマンドを使って再度「line」に入れ直しています。15行目でさらに、その「line」の中の「is」を「are」に変換して、16行目でファイルへ出力しています。
以下、出力ファイルです。
ちゃんと、「woman」→「girl」、「is」→「are」と二つの単語が置換されていることが確認できました。
はじめまして。
本記事を参考に置換処理を作成したのですが、期待通りに動作させることができず困っている現象があります。
もし対処方法がわかれば教えていただけませんでしょうか。
置換したい元ファイルに!が含まれている場合、!が反応してうまく動きません。
回避方法はありませんでしょうか?
例えば
50 TITLE ★にけつッ!!★和牛登場!水田は“要注意人物”温厚な川西が初めてキレた!
は
50 TITLE ★にけつッ水田は“要注意人物”温厚な川西が初めてキレた
になってしまい、
22 TITLE BAZOOKA!!!#221 高校生RAP選手権事前SP
は
22 TITLE BAZOOKA#221 高校生RAP選手権事前SP
になってしまいます。
(!単体だと削除され、!が複数ある場合、!に挟まれている文字が消えてしまいます)
これらの文字列は置換したい文字を含んでおらず、単に元ファイルから読み込み、
出力先ファイルに書き出すだけなのですが、!が反応してしまい、必要のない削除が行われてしまっています。
解決方法を教えていただけませんでしょうか。