|
最近在学习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', '超时未领完');2 w3 k0 P6 X( i" z; d* ?0 f; k
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', '超时未领完');; |2 S Z2 C! K9 |) m' \
--
1 ~, s/ a; T! E: P; K3 i+ @+ S BONUSID number(11) ,3 H. w9 r. z) q: i6 G$ ?- Y4 u
DELETEFLAG number(2) ,) v$ \( F/ W7 T& X# g* ^5 _9 `
TYPE number(2) ,3 _6 @8 J' P ^7 V
); " E. r4 k* K5 }6 L+ s- W
CREATE TABLE bonususer (8 K9 |) ~# S; s/ D; }
--2 G- x4 g0 _. H, t* m
SENDUSERID number(11) ,
8 ]( B' K1 v- ^8 X3 [8 h SENDUSERNAME varchar2(32) ,3 f+ h& d5 ~7 m
BONUSTICKETNO varchar2(32) ,$ \/ Z& U( }$ `8 O$ N
); 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');
) y3 m" |* _1 vINSERT 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');1 V7 J, Z8 _# N; c& @, ~; S& r
--
$ t! C# B$ T' f; M receiveUserId number(11) NOT NULL,$ e0 v, Z2 X2 B! p* w
deleteFlag number(1) NOT NULL ,9 X( Q5 W; \% E; \9 C
createTime date ,) U' \3 V: Y0 U9 u
); INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');9 m4 X0 X* z" u$ v4 D) x2 L' X
INSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');- M8 q- D% a1 I" C! m# L# i) q
要求:3 S- Z8 h" Y( T1 n
使用sed删除以)开头的行的上一行末尾的逗号
+ I5 {& k. a1 J7 Q, R苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。 答案:
4 D% g: j; s8 n8 A[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file+ J6 I- L9 p8 |) E9 p
20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');6 A: k6 L( K# t6 b5 f N
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', '超时未领完');/ R+ x6 P" Z/ L# _# R; o
--" G6 g( n1 H/ p: y& g- ~6 l
BONUSID number(11) ,& k* V: e3 c; q, k( P% [; Z1 M
DELETEFLAG number(2) ,; W) B; W) u0 i" @0 w& u
TYPE number(2)
7 w( j# ]( c, c, ? [0 [);
# b9 o) v+ B7 _5 XCREATE TABLE bonususer (1 C* x; a7 `, p) L8 Z4 `
--0 E7 Y# N2 x8 d! I
SENDUSERID number(11) ,. P0 U1 ~4 y% b4 q8 D
SENDUSERNAME varchar2(32) ,
" B1 m- q C* E3 H- o0 l+ `0 \ BONUSTICKETNO varchar2(32)
1 K( q- X: _' x! j q2 [);
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');
% @$ N6 m9 i5 N! a- J6 Q2 yINSERT 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');: ?. j9 y# C9 R5 ~8 _9 c4 T- f0 Z
--
+ G( Q" F: L5 n6 m2 u receiveUserId number(11) NOT NULL,
$ ^% o$ J& R( Z2 i deleteFlag number(1) NOT NULL ,! [' V, F3 q1 s# }% i4 \( t1 Z8 b
createTime date
$ M& W; z! q5 x0 h( B); INSERT INTO rb_bon
" V/ H# n$ k+ \0 e" u1 @' n6 N% x+ [0 Y4 {! u
解释:
$ K4 Z3 \( Y6 z1 u7 i\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)
4 h& c1 X; y& b" N' \5 [\s*就是有0到n个空格或\n) P% w- b" j( i- p3 ^) \
/,/{}只要找到“,”就执行{}里的语句/ N# D H9 x8 a7 `4 Q! W
:loop就是个标识,bloop 就是跳转到:loop
5 V8 D6 k8 E# r" C; gN是把下一行加入模式空间
1 E! w8 q* y$ N8 _/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句
7 j& W3 x* | h# x7 \1 o/ `s/,\s*)/\n)/ 就是去掉“,”号
5 k0 k6 o1 o5 Y+ V% B6 V' X |