如何在 sql 轉儲文件中正確使用 sed 或 awk?
關於它顯示的模式,我需要修改一個 sql 轉儲文件。模式如下:
/*!50001 CREATE ALGORITHM=UNDEFINED */
/ *!50013 DEFINER=‘test’@’%’ SQL SECURITY DEFINER */
/ *!50001 VIEW ‘SOME DATA’ AS select ‘SOME DATA’.‘SOME DATA’ AS ‘一些數據’,‘一些數據’。‘一些數據’作為’一些數據’…
/ *!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
它awk
:/*!50001 CREATE VIEW ‘SOME DATA’ AS 選擇’SOME DATA’。‘SOME DATA’ AS ‘SOME DATA’,‘SOME DATA’。‘SOME DATA’ AS ‘SOME DATA’,‘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 */;
總而言之,我想刪除 CREATE 和 VIEW 之間的所有內容。我嘗試了以下命令,但沒有奏效:
sed 's/50001 CREATE.*VIEW//' dumpsqlfile.sql sed "/50001 CREATE/,/VIEW/d" dumpsqlfile.sql
- 如果
CREATE
在該行中,則刪除其後的所有內容並將結果行保存在saved
.- 如果
saved
為空,則列印目前行- 如果
saved
已設置且此行包含VIEW
,則刪除之前的所有內容VIEW
,列印前saved
一行,然後列印目前修改的行並saved
再次為空。/CREATE/{sub(/CREATE.*/,"CREATE");saved=$0} !saved saved&&/VIEW/{ sub(/.*VIEW/,"VIEW") print saved " " $0 saved="" }
將其另存為 a
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
,包括邊界線。