표시된 스키마를 기반으로 수정해야 하는 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 */
/ *!50001 SET Character_set_results = @saved_cs_results */
/ *!50001 SET collation_connection = @saved_col_connection */;
/*!40103 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_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