SQLダンプファイルでsedまたはawkを正しく使用する方法は?

SQLダンプファイルでsedまたはawkを正しく使用する方法は?

示されたスキーマに基づいて変更する必要があるSQLダンプファイルがあります。パターンは次のとおりです。

/*!50001 CREATE ALGORITHM=UNDEFINED */
/ *!50013 DEFINER='test'@'%' SQL SECURITY DEFINER */
/ *!50001 VIEW 'SOME DATA' AS 選択 'SOME DATA'.'SOME DATA' AS '一部のデータ」、「一部のデータ」。 「一部のデータ」...
/ *! 50001 SET Character_set_client = @saved_cs_client *
/ /
*!
/ *! 40103 TIME_ZONE = @OLD_TIME_ZONE設定* /;

sed各パターンに対して両方またはawk両方を使用して変更したいと思います。

/*!50001 CREATE VIEW 'SOME DATA' AS 'SOME DATA' を選択します。 ../*
! 50001 Set Character_Set_results=
@Saved_CS_Results*
//*! 50001 Set
Time_zone = @OLD_TIME_ZONE */;

全体として、CREATEとVIEWの間のすべての項目を削除したいと思います。次のコマンドを試しましたが、機能しません。

sed 's/50001 CREATE.*VIEW//' dumpsqlfile.sql
sed "/50001 CREATE/,/VIEW/d" dumpsqlfile.sql 

ベストアンサー1

  • その行にある場合は、CREATEその後のすべての項目を削除し、結果行をsaved

  • 空の場合は、saved現在の行を印刷します。

  • saved設定して行にが含まれている場合は、VIEW前のすべての内容が削除され、以前の行がVIEW印刷savedされ、現在変更されている行が印刷され、saved再び消去されます。

/CREATE/{sub(/CREATE.*/,"CREATE");saved=$0}
!saved
saved&&/VIEW/{
        sub(/.*VIEW/,"VIEW")
        print saved " " $0
        saved=""
}

として保存し、script.awkを使用して実行しますawk -f script.awk dumpsqlfile.sql。出力:

/*!50001 CREATE VIEW 'SOME DATA' AS select 'SOME DATA'.'SOME DATA' AS 'SOME DATA','SOME DATA'.'SOME DATA' AS 'SOME DATA'...
/ *!50001 SET character_set_client = @saved_cs_client */;
/ *!50001 SET character_set_results = @saved_cs_results */;
/ *!50001 SET collation_connection = @saved_col_connection */;
/ *!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;


sed 's/50001 CREATE.*VIEW//' dumpsqlfile.sql

動作しませんsedはライン指向のツールだからです。改行文字に達するとパターン検索を停止します。そして

sed "/50001 CREATE/,/VIEW/d" dumpsqlfile.sql 

返品動作しませんこれは、境界線を含む50001 CREATE一致する行まで、一致する線間のすべての線を削除し始めるためです。VIEW

おすすめ記事