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 */
/ *!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

관련 정보