やりたいこと検索

ファイル内の文字列を置換する

 

こんなことを知りたい人へ向けて書いています

  • Windowsバッチファイルでファイル内の文字列を置換する方法を知りたい方
  • ファイル内の文字列を置換する方法を知りたい方
  • ファイル内の複数の文字列をいっぺんに置換したい方

 

目次

その他の関連しそうな記事

 

文字列を置換する

バッチファイル内で文字列を置換するには、

とします。これで[置換対象文字列]で指定した文字列の中の[置き換えられる文字列]が[置き換え後の文字列]に置換されます。

例として、以下のバッチファイルは置換対象文字列「The woman’s name is ‘Risa’.」の「woman」を「girl」に置き換えています。

まず初めに4行目で「The woman’s name is ‘Risa’.」を変数「string」へ代入しています。6行目の「echo」コマンドは変数「string」の中身を表示させて置換前の文字列をチェックしています。

9行目のコマンドで、その中にある「woman」を「girl」に置き換え変数「replaced_string」に代入しています。「=」の右辺が、

の形になっていることを確認できると思います。最後に最終行で置換後の文字列を表示させてチェックします。

 

以下が上記のバッチファイルの実行結果ですが、置換前と置換後の出力から、「woman」が「girl」に置き換わっていることが確認できます。

ファイル内文字列を置換する 文字列の置換

これが、バッチファイルで文字列を置換する方法です。次は、ファイル内の文字列を置換する方法を紹介します。

 

ファイル内の文字列を置換する

ファイル内の文字列を対象に置換操作を行う場合、前節の[置換対象文字列]を「for」コマンドを使って、ファイルから取得します。

「file.txt」に、

The woman’s name is ‘Risa’.
Tear is woman’s weapon.

ファイル内文字列を置換する 置換対象ファイル

と記述してあったとします。

このファイルの「woman」を「girl」に書き換えるバッチファイルは以下の通りです。

まずは、このバッチファイルを実行して、出来上がった置換後のファイルを以下に示します。

ファイル内文字列を置換する 置換後のファイル

「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」コマンドは変数に値や文字列を代入するために使用するコマンドであり、

などとすると変数「line」に「文字列」という文字列を代入することができます。「set」コマンドについては「set(変数の設定・計算・ユーザーからの入力情報の取得) -コマンド別解説-」が詳しいです。

以下のバッチファイルプログラムは、「woman」を「girl」へ、「is」を「are」へ置換するものです。

woman → girl
is → are

13行目までは前節のバッチプログラムと同様です。14行目は「woman」を「girl」に変換していますが、変換後の文字列を「set」コマンドを使って再度「line」に入れ直しています。15行目でさらに、その「line」の中の「is」を「are」に変換して、16行目でファイルへ出力しています。

以下、出力ファイルです。

ファイル内文字列を置換する 複数文字の置換後のファイル

ちゃんと、「woman」→「girl」、「is」→「are」と二つの単語が置換されていることが確認できました。

Windowsバッチファイル初心者へ向けた入門書を作成しました


Windowsバッチファイル初心者の方へ向けた入門書(PDF)を作成しました。


・初めてWindowsバッチファイルを勉強してみようと思っている方

・使ったことはあるが一から基礎を学び直したい方


へ向けて丁寧な解説を行っています。


「全くプログラムを知らない方でも、この入門書を読んだ後には、Windowsバッチファイルの中級者レベルになれるように」をコンセプトに執筆したものです。


この本を読めば、バッチファイルを使ったファイルやフォルダの操作に関しては一通りのことができるようになります。そうなればもう十分中級者と呼べるレベルですので、あとは自分のやりたいことを実現しようとする中で徐々に知識を蓄えていくだけですぐに上級者へなれるでしょう。


詳しくみる

関連ページ

コメント

  1. 白ネズミ より:

    はじめまして。
    本記事を参考に置換処理を作成したのですが、期待通りに動作させることができず困っている現象があります。
    もし対処方法がわかれば教えていただけませんでしょうか。

    置換したい元ファイルに!が含まれている場合、!が反応してうまく動きません。
    回避方法はありませんでしょうか?
    例えば
    50 TITLE ★にけつッ!!★和牛登場!水田は“要注意人物”温厚な川西が初めてキレた!

    50 TITLE ★にけつッ水田は“要注意人物”温厚な川西が初めてキレた
    になってしまい、
    22 TITLE BAZOOKA!!!#221 高校生RAP選手権事前SP

    22 TITLE BAZOOKA#221 高校生RAP選手権事前SP
    になってしまいます。
    (!単体だと削除され、!が複数ある場合、!に挟まれている文字が消えてしまいます)

    これらの文字列は置換したい文字を含んでおらず、単に元ファイルから読み込み、
    出力先ファイルに書き出すだけなのですが、!が反応してしまい、必要のない削除が行われてしまっています。
    解決方法を教えていただけませんでしょうか。

コメントを残す