Text-Processing

如何在 sql 轉儲文件中正確使用 sed 或 awk?

  • June 4, 2020

關於它顯示的模式,我需要修改一個 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 collat​​ion_connection = @saved_col_connection */;

/ *!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

並且每種模式,我都想使用或兩者來修改sedawk

/*!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 collat​​ion_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=""
}

將其另存為 ascript.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,包括邊界線。

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