2017-09-03 17 views
0

私は間違いをしました。最初は、独立したページでDBログを選択しなかった。 DBログをコードにした374のPHPページ。私のLinuxサーバのこれらのページは、同じダイレクトで。コンテンツを文字列に置き換える方法は?シェル

DBページコード内のログを持つ一部のページ:

try 
{ 
    $conn=new PDO('mysql:host=localhost;port=3306;dbname=hpc' , 'xxx' , 'xxx'); 
} 
catch(PDOException $e) 
{ 
    echo "connect failed!".$e->getMesage(); 
    exit; 
} 

DB pagasコード内のログを持つ一部のページ:

$conn = new PDO('mysql:host=localhost;port=3306;dbname=hpc' , 'xxx' , 'xxx'); 
    $conn->setAttribute(PDO::ATTR_ORACLE_NULLS, true); 

今私はそれらを引き継ぐために一つだけをdb.phpを使いたいですinclude( "DB.php");

sed -i "/^try/^}$/,s/.*/include(\"DB.php\")/"g" * 

sed -i "/^conn/true)\;$/,s/.*/include(\"DB.php\")/g * 

をしかし、彼らは失敗しました:私が試してみました。私はsed:sed -i "s/A/B/g" *を使用して文字列を引き継ぐことを知っています。しかし、私は文字列にコンテンツを置き換える方法を知らない。誰が私を助けることができますか?

+0

可能性のsed、誤解しないでくださいと他人を交換したくない場合は、要件を慎重に定義する必要があります。 'try'で始まるものを置き換えなければならないのですか?9行を1行と置き換えてincludeする必要がありますか?それとも' new PDO'を持っている行から見なければなりませんか? –

+0

2番目の 'Some pages ...'はあなたの期待される出力をブロックしますか?それがあなたの期待される出力であれば、それが何であるかを明確にして期待される出力を加えてください。 –

答えて

0

tryブロックをincludeステートメントに置き換えてください。それはsedでそうすることは可能ですが、私はそれがはるかに簡単perlにそうすることを見つける:

perl -i.bak -nE 'if (/^try/ .. /^}/) {say q [include("DB.php")] unless $done ++} else {print} $done = 0 if eof' * 

は注意してください、上記のコードは、各ファイル内の最初のものを(置き換え、 tryブロックを払拭します)をインクルードステートメントで置き換えます。あるファイルにもっと多くのtryブロックがある場合には、何らかの修正が必要です。

0

私は(?完全に)は、あなたがそれだけで「PDO」でこれらのブロックを交換したいときソリューションは

// replace try-catch block 
sed -i '/^try/{:t;N;/exit;\n}$/!bt;s/.*/include("DB\.php");/}' * 

// replace your second pattern 
sed -i '/\$conn/{N;/true/s/.*/include("DB\.php");/}' * 
関連する問題