示されたスキーマに基づいて変更する必要がある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