2017-09-03 42 views
0

我犯了錯誤。起初,我沒有選擇獨立頁面中的數據庫日誌。現在使用DB登錄代碼的374個PHP頁面。這些頁面在我的linux服務器上同樣直接。如何用字符串替換內容?殼

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

與日誌有些在DB pagas代碼:

與日誌DB頁代碼有些

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

現在我想只用一個db.php中接管他們包括( 「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

如果你只想在它來代替這些塊與「PDO」(徹底?)不要想取代其他,你必須仔細確定你的要求。我們是否需要替換以'try'開始的東西(並且用include包含一行代替9行)還是必須從其中包含'new PDO'的行開始環視? –

+0

第二個「某些網頁...」是否會阻止您的預期輸出或其他內容?如果它是您的預期產出,那麼請解釋轉化,如果它不是那麼澄清它是什麼,並添加您的預期產出。 –

回答

0

它在我看來你想用include語句替換每個try塊。雖然可以在sed這樣做,我覺得它更容易在perl這樣做:

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

要小心,上面的代碼打掉每個 try塊,僅替換第一個(每個文件)與包含聲明。如果文件中有更多的嘗試塊,則需要修改一些。

0

如果我不要誤會,一個sed的的解決辦法是

// 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");/}' *