|
最近在学习Oracle11g数据库时,需要将MySQL数据插入脚本转换成Oracle脚本,以在Oracle数据库中新建表和插入数据,方便练习。可是MySQL脚本太大,普通文本编辑器无法处理(7个G),于是用Linux下的sed老牌流编辑器来做。其中,有一段SQL脚本内容如下, INSERT INTO bonusreturnorder VALUES ('47', '224', '1300573', '2', '1', 'WX20160203083601539373', 'HBTK20160204020000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');. J- R& E9 e9 \" x
INSERT INTO bonusreturnorder VALUES ('50', '254', '697', '2', '1', 'WX20160203085132174280', 'HBTK20160204020001045349', '2016-02-04 02:00:02', '2016-02-04 02:00:01', '600.00', '超时未领完');
1 T/ j) Q! w, Z2 z--
% D0 H( h$ |* n4 O6 j# j BONUSID number(11) ,6 d8 K+ m9 T! Y2 {/ J$ \' o0 D
DELETEFLAG number(2) ,
- A" O2 [. W5 d, s TYPE number(2) ,
% R+ d# U* F% ^0 L);
7 ?$ ^; [6 s3 v; B) ?% I% k1 n! PCREATE TABLE bonususer (/ C& |3 }9 E- U2 c* s" s$ b
--
- U. Z+ T7 t0 {* v SENDUSERID number(11) ,; X3 ^, P# \* L- b* Z
SENDUSERNAME varchar2(32) ,
3 c+ E! d( K0 p9 s BONUSTICKETNO varchar2(32) ,. Z5 e2 W- U, f8 m9 f. Y# P
);
INSERT INTO bonususer VALUES ('332', '155', '100.00', '85705', '3', '2016-02-03 07:12:27', '2016-02-03 07:13:11', null, '1', '1322', null, 'HB201602030712277209291');
6 Q$ p v$ ^( IINSERT INTO bonususer VALUES ('335', '155', '100.00', '1322', '3', '2016-02-03 07:12:27', '2016-02-03 07:12:38', null, '1', '1322', null, 'HB201602030712277209292');
9 l- s% |) i0 [& @1 e! x--
6 P5 {) s& d3 r2 e' B0 u% g z receiveUserId number(11) NOT NULL,
) z& p( @2 W% s3 f* F/ v8 g deleteFlag number(1) NOT NULL ,
5 u9 w$ y; V7 j. G createTime date ,8 G9 ~4 l# Y, B3 H$ r9 U. _
); INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');
/ a& U' B1 U/ k& O$ GINSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');' [: C5 a3 [% @+ v3 M F
要求:' |0 |% z) Y5 a+ ]3 `( n" s
使用sed删除以)开头的行的上一行末尾的逗号
8 J, h0 s' U1 X# s! p苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。 答案:
) L, ]# l9 p( w1 ` Y; ?) i* Y[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file e# L0 W ]& V7 W$ W
20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');
/ ^' H9 T7 ?8 ]1 @( `: hINSERT INTO bonusreturnorder VALUES ('50', '254', '697', '2', '1', 'WX20160203085132174280', 'HBTK20160204020001045349', '2016-02-04 02:00:02', '2016-02-04 02:00:01', '600.00', '超时未领完');' W3 f. H5 g7 f% r
--, T! \; a8 ~- _6 Q' P" M3 T3 A
BONUSID number(11) ,
7 H) R8 F7 q# y. I( E; l; q DELETEFLAG number(2) ,+ n. ?/ C8 B z8 M1 p
TYPE number(2)
6 k T+ e- E7 S0 W3 C* S2 }9 S4 K);
5 |7 ?/ e$ ^6 TCREATE TABLE bonususer (0 Z" o# `/ I9 |- N% B: @. F
--
2 A Y+ D, u% \. S: e0 X% q SENDUSERID number(11) ,
# I3 I0 L# `. X, e5 g: A SENDUSERNAME varchar2(32) ,
$ d5 A. S/ ~" ]/ m$ B+ x# ? BONUSTICKETNO varchar2(32)
) K& ~% @2 t# C);
INSERT INTO bonususer VALUES ('332', '155', '100.00', '85705', '3', '2016-02-03 07:12:27', '2016-02-03 07:13:11', null, '1', '1322', null, 'HB201602030712277209291');- e3 M. Q0 E) E; z% B
INSERT INTO bonususer VALUES ('335', '155', '100.00', '1322', '3', '2016-02-03 07:12:27', '2016-02-03 07:12:38', null, '1', '1322', null, 'HB201602030712277209292');
5 Q8 ~5 y; r! I/ t7 ^--! k1 @; ~6 ?' P5 G7 J6 J3 X% f
receiveUserId number(11) NOT NULL,
& [$ O _4 z* @; H: S) n, B deleteFlag number(1) NOT NULL ,
& Z3 u2 K6 _( b9 a8 A6 I, \ createTime date
; V5 N; `* Y5 N4 F! K); INSERT INTO rb_bon
8 J$ Q. W: m. H) T
$ ]4 s" p% ~# {6 O( t解释:
% ?$ U. t# N) d! R0 r: d( P* i\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)
2 v" @- _3 {7 o- S" u0 \\s*就是有0到n个空格或\n4 `0 M: O! f, k6 y6 W. n
/,/{}只要找到“,”就执行{}里的语句
, L! n3 |0 Y% N$ k5 {% N1 Z3 ~:loop就是个标识,bloop 就是跳转到:loop
$ m% a! d/ h2 S; C6 O! A8 z \4 |2 JN是把下一行加入模式空间
' S5 u( }6 f/ x/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句, M# S l8 n1 z( _; f Z
s/,\s*)/\n)/ 就是去掉“,”号
9 d8 |* ^5 i4 e |