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というバックアップファイルも作成します。
ディレクトリはあらかじめ作成しておかないとエラーになるようです。
- Perlでansibleライブラリを作成する方法
- perlのCPANモジュールからRPMを作成する方法
- Perlで「Subroutine permission redefined at~」を抑止する方法
- XML::Simpleのインストールでエラーになる場合の対処
- YAML::Tinyで「YAML::Tiny found bad indenting in line~」というエラーになる場合の対処
- Perlの正規表現を使って文字列をまとめて取得する方法
- Perlのハッシュでキーの有無を調べる方法
- perlで配列の途中の要素を削除する方法
- YAML::Tinyでコロンを利用する方法
- Perlで改行コードがCRのファイルを読み込む方法
- Perlで「Possible precedence issue with control flow operator」という警告の対処
- PerlのLWPで「Can't verify SSL peers without knowing which Certificate Authorities to trust」というエラーになったときの対処
- Perl+Windowsでファイルを再帰的にリネームする方法
- Perlプログラムの中でファイルの一部を書き換える方法
- Perlの「Bareword "%s" not allowed while "strict subs" in use~」というエラーについて