Perl ワンライナーでファイル内の文字列を一括置換する


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 コマンドでの一括置換を試してみて下さい。