SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZineニュース

[PHPプロ!] PHPのワンライナーでファイルの文字列置換を行う方法

  • このエントリーをはてなブックマークに追加

  • このエントリーをはてなブックマークに追加

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開発...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1028 2007/02/20 12:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング