テキストファイルの中の文字列を、一定のルールに従ってすべて自動的に置換したいと思ったことはないだろうか。
簡単な置換であればテキストエディタで開いて、手動で目で確認しながらやれば良いが、対象が何十ファイルにもおよび、適用ルールも何個もあり、対象テキストが長いとなれば、手動では間違いや取りこぼしが発生する可能性が高くなり、そして何よりも労力が半端なくかかってしまう。
そこで今回は、今流行りのGO言語 (golang) を使って、テキスト置換を行う方法を紹介したいと思う。
まとめ
結論から言えば、strings.ReplaceAll
という関数を使えば良い。
GO言語のインストール方法 (Windows編)
Windowsをお使いであれば、以下の手順でインストールすることができる。
- https://go.dev/dl/ を開く
- Microsoft Windowsと書かれた箇所のmsiファイルをダウンロードする
- ダウンロードしたmsiファイルをダブルクリックし、Nextボタンを何回か押し、Installボタンを押してインストールを完了させる
- コマンドプロンプトを開き、
go version
コマンドを実行し、Goのバージョンが表示されればインストール成功
GO言語のインストール方法 (macOS編)
macOSでは、brewというツールを使ってインストールするのが便利である。
- https://brew.sh/index_ja を開き、記載されているインストール コマンドをターミナル画面にペーストし実行する(Enterキーを押す)
- ターミナル画面で
brew install go
とタイプして、実行する go version
コマンドを実行し、Goのバージョンが表示されればインストール成功
Visual Studio Code (統合開発環境) のインストール
- https://code.visualstudio.com/ を開き、Downloadsからダウンロードして、Visual Studio Code (以下VSCodeと称します) をインストールする
- Extensionの検索画面を開き、「go」で検索して、Goエクステンションをインストールする
replace.goを作成する
VSCodeを開き、新規ファイルを作成し、以下のコードを貼り付け、replace.goという名前で保存する。
package main
import (
"fmt"
"io/ioutil"
"os"
"strings"
)
func main() {
// 引数の存在チェック
if len(os.Args) < 2 {
fmt.Println("please specify target file path")
return
}
// ファイルを開き、内容を変数に読み込む
fileName := os.Args[1]
bytes, err := ioutil.ReadFile(fileName)
if err != nil {
fmt.Println("could not open the file", fileName)
return
}
contents := string(bytes)
// 置換する(上の方が優先順位高い)
contents = strings.ReplaceAll(contents, "素晴らしい", "不思議だ")
contents = strings.ReplaceAll(contents, "GO言語", "COME言語")
contents = strings.ReplaceAll(contents, "GO", "頑張れ")
// ファイルに書き戻す
err = ioutil.WriteFile(fileName, []byte(contents), os.ModePerm)
if err != nil {
fmt.Println("could not write to the file", fileName)
return
}
fmt.Println("done")
}
サンプルテキストを作成する
置換対象のサンプルファイルとして、VSCodeを開き、新規ファイルを作成し、以下の内容を貼り付け、sample.txtという名前で保存する。
こんにちは。
GO言語は素晴らしい!
GO! GO!
実行する
通常、Go言語は、コードをコンパイルしてから、その出来上がったバイナリファイルを実行するが、コンパイルと実行を一気に行うこともできる。
ファイルを保存したのと同じディレクトリにて、コマンドプロンプト(Windows)もしくはターミナル(macOS)にて、下記のコマンドを実行する。
go run replace.go sample.txt
すると done
と表示されて、実行が完了する。
ここで、sample.txtをダブルクリックして開くと、以下のようになっているはずだ。
こんにちは。
COME言語は不思議だ!
頑張れ! 頑張れ!
解説
GO言語において、テキストの置換は strings.ReplaceAll によって行います。
第1引数に置換対象の文字列が含まれた変数、2番目に置換したい対象の文字列、3番目に何に置換するかを指定します。
GO言語で書くことの利点としては、上から順に実行されるので、優先度の高い置換ルールを上に書いておけば、それから先に実行されるようにすることができます。
たとえば、「GO」を「頑張れ」に置換したいが、「GO言語」だけは「COME言語」に置換したい場合、そのルールを先に書けばいいのです。
これは、秀丸エディタやWord等の他のテキストエディタでは、置換ルールを何回も変えて実行しないと実現できませんが、プログラムで行えば、一発で変換ができるので、便利です。
本記事のコードgithubからクローンできます
本記事のコードは https://github.com/iwaon/replace_text にて公開しています。
gitというコード管理プログラムが入っていれば、以下のコマンドにより、本記事のコードをローカルディレクトリにクローンすることができます。
git clone git@github.com:iwaon/replace_text.git
コメント