perlでは-pieオプション(正確には-p -i -eを組み合わせたもの)を使うことで、コマンドラインから簡単に文字列処理を行うことができます。たとえば、perl -p -i -e 's/foo/oof/g' somefileと記述すると、somefile中の文字列fooをoofに置換することができます。同じことをPHPでも行うための方法が、PeaaycHPeeにて取り上げられていますので、紹介いたします。
perlでは-pieオプション(正確には-p -i -eを組み合わせたもの)を使うことで、コマンドラインから簡単に文字列処理を行うことができます。たとえば、perl -p -i -e 's/foo/oof/g' somefileと記述すると、somefile中の文字列fooをoofに置換することができます。同じことをPHPでも行うための方法が、PeaaycHPeeにて取り上げられていますので、紹介いたします。
この方法を使うと、指定したファイルに文字列処理を行い、上書き保存することができます。多くのUNIXコマンドが、入力に使用したファイルの内容に対して上書き保存ができないため、この方法は非常に便利だと感じます。
具体的なソースコードは以下のようになります。
#!/usr/bin/php <?php // 上記のパスを実際の場所に合わせる $interpreter = array_shift($_SERVER['argv']); $script = array_shift($_SERVER['argv']); $files = array_filter($_SERVER['argv']); if (!$script) { fwrite(STDERR, "使い方: $interpreter <script> [files]\n"); fwrite(STDERR, " 各ファイルの各行をループして処理します\n"); fwrite(STDERR, " \$_ 変数には現在の行のないが格納されます\n"); fwrite(STDERR, " ファイルの指定がない場合は標準入力・出力を用います\n"); fwrite(STDERR, "\n"); fwrite(STDERR, " 例: ./pie.php 'preg_replace(\"/foo/\",\"oof\",\$_);' testfile\n"); fwrite(STDERR, " testfile中のfooをoofに置換します\n"); fwrite(STDERR, "\n"); exit(1); } // 関数をセットアップする $func = create_function('$_', 'return '. $script .';'); if (!$files) { // ファイルが指定されない場合は標準入力を使用 $buf = ''; while (!feof(STDIN)) { $buf .= $func(fgets(STDIN)); } echo $buf; } else { foreach ($files as $f) { if (!is_writable($f)) { fwrite(STDERR, "Can't write to $f\n"); continue; } $buf = ''; foreach (file($f) as $l) { $buf .= $func($l); } file_put_contents($f, $buf); } } ?>
ソース中にも記述があるとおり、このスクリプトを使って
./pie.php 'preg_replace("/foo/","oof",$_);' testfile
と記述すると、testfile中にある文字列fooが、oofに置換されます。
同様に、mbstring関数を使うと、簡単に文字列置換やエンコーディング変換もできます。
./pie.php 'mb_convert_encoding($_,"utf8","euc-jp");' testfile
とすると、euc-jpで記述されているファイルを、UTF8に変換できます。
非常に便利なこのスクリプト、ぜひお試しください。(PHPプロ!)
関連リンク
転載元
PHPプロ!:最新のPHPニュース
この記事は参考になりましたか?
- この記事の著者
-
PHPプロ!(PHPプロ!)
「PHPプロ!」は、アシアル株式会社が運営するPHP開発者のためのポータル&コミュニティサイトです。同サイトでは、PHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座、PHP中級者のためのTIPSメーリングリスト、中・上級者向けの技術ノウハウ満載のPHPプロ!マガジンの提供など、PHP開発...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です