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

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

Posted at June 25,2014 12:55 AM
Tag:[Perl]

Perlのワンライナーで複数ファイルの文字列を一括置換する方法を紹介します。

1.はじめに

Perlのワンライナー(コマンドラインから実行する1行プログラム)を使えば、複数ファイルの文字列の一括置換を行うことができます。

この作業を行うたびに毎回ネットで検索してしまうので、このエントリーでまとめておきます。

ここでは、拡張子が「.txt」のファイルに含まれる文字「foo」を「bar」に変換する例で順を追って説明します。

2.コマンドラインの文字列をスクリプトにする

まず、perlワンライナーとして動作させるために、「-e」オプションを付与してコマンドラインに入力した文字列('s/foo/bar/g')をスクリプトにします。

% perl -e 's/foo/bar/g' *.txt

3.繰り返し処理と標準出力

繰り返し処理と標準出力をさせるには、「-p」オプションを付与します。

% perl -pe 's/foo/bar/g' *.txt

こうすることで、赤色で示すループ処理と標準出力処理が入力したスクリプトの回りにあるように振る舞います。

while(<>) {
    s/foo/bar/g;
} continue {
    print or die "-p destination: $!\n";
}

4.行末処理を追加する

行末処理を追加するには「-l」オプションを付与します。

% perl -lpe 's/foo/bar/g' *.txt

こうすることで自動的にchompを行ってくれます。

while(<>) {
    chomp;
    s/foo/bar/g;
} continue {
    print or die "-p destination: $!\n";
}

5.ファイルを上書きする

前項までは標準出力に結果が出力されます。

実行結果を元のファイルに反映させるには、「-i」オプションを付与します。

% perl -pi -e 's/foo/bar/g' *.txt

これで実行結果が標準出力に表示される代わりに、元のファイルに上書きされます。

6.ファイルのバックアップを作成する

5項で、元のファイルに上書きすると同時にバックアップを作成したい場合は、-iオプションに「.bak」などの拡張子を付与します。

% perl -pi.bak -e 's/foo/bar/g' *.txt

これで、foo.txtというファイルを処理したときにfoo.txt.bakというバックアップファイルも作成します。

7.ファイルのバックアップを異なるディレクトリに作成する

ファイルのバックアップを異なるディレクトリに作成するには、-iオプションの後方にディレクトリを指定します。

% perl -pi'old/*.bak' -e 's/foo/bar/g' *.txt

これで、foo.txtというファイルを処理したときに、old/foo.txt.bakというバックアップファイルも作成します。

ディレクトリはあらかじめ作成しておかないとエラーになるようです。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)