Perl ワンライナーでファイル内の文字列を一括置換
Linux でファイル内の文字列の一括置換を行う方法は色々とありますが、最も簡単な方法は Perl の1行コマンドで一括置換するのがオススメです。Perl プログラムはほぼ全ての Linux ディストリビューションに最初から導入されているはずです。しかもファイルを開かずに1行コマンドでファイルの中身を一括置換できるので非常に便利です。
テスト用のファイルを準備
まず以下のようなカンマ区切りのデータを用意します。このファイル内の "two" という文字列を "pikachu" に一括置換してみます。$ cat test.txt 123,456,789 abc,def,ghi one,two,three red,blue,yellow two,two,two
Perl コマンドで文字列を一括置換 (ファイルの内容を書き換えずに一括置換)
では早速ファイル内の "two" という文字列を "pikachu" に一括置換してみましょう。いきなりファイルの中身を書き換えるのは危険ですので、まず最初はファイルの内容は書き換えず、画面に出力される文字列だけを一括置換します。
$ perl -p -e 's/two/pikachu/gi' test.txt 123,456,789 abc,def,ghi one,pikachu,three red,blue,yellow pikachu,pikachu,pikachu
"two" という文字列が全て "pikachu" に書き換わっています。"gi" という文字がありますが、これは "g" がグローバル検索オプションで、何度も同じ文字列が出てきても全てを置換対象とするものです。また "i" は大文字小文字を無視して 一致する文字列を探してくれるオプションです。
Perl コマンドで文字列を一括置換 (ファイルの内容を書き換えて一括置換)
前述のコマンドで正しく書き換えたい文字列が意図した通りに書き換わっていることが確認できたら、次にファイルの中身を直接書き換えて一括置換してしてみます。$ perl -pi -e 's/two/pikachu/gi' test.txt $ cat test.txt 123,456,789 abc,def,ghi one,pikachu,three red,blue,yellow pikachu,pikachu,pikachu
上手く書き換わっていますね。
perl コマンドに続けて "-p" オプションを付けています。このオプションは、入力されたファイルを1行づつ処理するという指定です。
また万が一置換処理を間違ってしまった場合に備えて、自動で変更前のファイルを自動的にバックアップしてからファイルを書き換えるという方法があります。"-i" オプションに続けてファイルの拡張子を指定してあげると、入力ファイルを置換した結果で上書きすると共に、指定された拡張子を付与したバックアップファイルを作成してくれます。
"-p" オプションと "-i" オプションを併せて "-pi" というオプションに続けて、バックアップファイルの拡張子をつけてあげます。以下ではファイルの中身を直接書き換える前に ".bak" というファイルに元のファイルをバックアップしておき、指定されたファイルの中身を書き換える、という動作を行います。
$ cat test.txt bc,def,ghi one,two,three red,blue,yellow two,two,two $ perl -pi.bak -e 's/two/pikachu/gi' test.txt $ cat test.txt bc,def,ghi one,pikachu,three red,blue,yellow pikachu,pikachu,pikachu $ ls test.txt* test.txt test.txt.bak
このようにファイルの中身が書き換わるとともに、バックアップファイルが作成されます。
バックアップされたファイルの中身は次の通り、一括置換前の内容になっていますね。
$ cat test.txt.bak bc,def,ghi one,two,three red,blue,yellow two,two,two
是非 Perl コマンドでの一括置換を試してみて下さい。