Shell-Script
從 mysqldump 中刪除行和尾隨逗號
我正在嘗試從 mysqldump 中刪除約束,然後再將其導入另一個 SQL 數據庫。Mysqldump生成的表看起來像這樣,帶有 1 個或多個約束:
CREATE TABLE `SOME_TBL` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'blah', /* ... */ PRIMARY KEY (`ID`) USING BTREE, CONSTRAINT `SOME_TBL_FC1` FOREIGN KEY (`SOME_FIELD`) REFERENCES `SOME_OTHER_TBL` (`ID`), CONSTRAINT `SOME_TBL_FC2` FOREIGN KEY (`ANOTHER_FIELD`) REFERENCES `ANOTHER_TBL` (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=3845453 DEFAULT CHARSET=utf8 COMMENT='data lives here';
我可以像這樣刪除約束線:
mysqldump --source-database \ | sed -E '/^ *CONSTRAINT/d' \ | mysql --result-database
但是我留下了尾隨逗號,例如:
CREATE TABLE `SOME_TBL` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'blah', /* ... */ PRIMARY KEY (`ID`) USING BTREE, ) ENGINE=InnoDB AUTO_INCREMENT=3845453 DEFAULT CHARSET=utf8 COMMENT='data lives here';
…哪個 SQL 不喜歡。(注意上面“BTREE”後面的逗號)。注意我不想刪除所有尾隨逗號,只刪除出現在換行符和關閉括號之前的那些尾隨逗號(類似於
,\n)
)刪除這些尾隨逗號和中流約束線的最簡單方法是什麼?請注意,轉儲可能有幾千兆字節,因此我不能簡單地將整個文件放入 perl 或其他東西中;我希望能夠將其作為管道的一部分。
之後我可能會執行一些使用 INFORMATION_SCHEMA 刪除約束的 SQL,但我想知道是否有更優雅的方法可以僅使用文本處理工具來執行此操作?
沒有理由不能在管道中使用*Perl 。*如果我們假設 \r (非DOS)行結尾並且程序是:
#!/usr/bin/perl unless( defined $previous && length $previous ){ $previous = `$_`; redo LINE; } if( m/CONSTRAINT/ ){ $previous =~ s/\,\s*\n$/ \n/; next LINE; } print $previous; $previous = `$_`; END{ print $previous; }
然後
cat dump.sql | perl -n program.pm | and so on
就行了。