Sed

如何通過管道傳輸 sed 命令?

  • September 19, 2022

我有一個 bash 腳本可以非常可靠地為我導入 wordpress dbs,但是我的一個站點來自以前的 wordpress 多站點,因此數據庫在數據庫中包含 DEFINERS,這會阻止以下程式碼正確執行

gunzip -c $destination_path_to_wordpress/folder/db-export.sql.gz | mysql -u $destination_db_user -p$destination_db_pass $destination_db_name

上述結果ERROR 1227 (42000) at line 3224: Access denied; you need (at least one of) the SUPER or SET_USER_ID privilege(s) for this operation

如果我手動導出數據庫然後執行sed 's/\sDEFINER=[^]*@[^]*//g' -i db-export.sql然後嘗試導入數據庫,那麼我可以成功導入數據庫,搜尋替換使用者名,並將它的站點。

問題:

將我目前的 db import 命令和擺脫定義器問題的 sed 命令結合起來的正確語法是什麼?以下是我想要實現的目標:

顯然不正確,但你明白了要點……

gunzip -c $destination_path_to_wordpress/folder/db-export.sql.gz | `sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i db-export.sql | mysql -u $destination_db_user -p$destination_db_pass $destination_db_name

有小費嗎?

謝謝

在這種情況下,您希望sed處理來自gunzip而不是來自文件的數據。省略文件名,它會愉快地從標準輸入(即從gunip)讀取並寫入標準輸出(即mysql)。

為了便於閱讀,我將其分為三行。它仍然會像這樣工作,但如果你真的願意,你可以將這些行合併為一個:

gunzip -c "$destination_path_to_wordpress/folder/db-export.sql.gz" |
   sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' |
   mysql -u "$destination_db_user" -p"$destination_db_pass" "$destination_db_name"

引用自:https://unix.stackexchange.com/questions/717739