|
最近在学习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', '超时未领完');
+ H+ u2 _& Z9 @) a& k7 ~4 bINSERT INTO bonusreturnorder VALUES ('50', '254', '697', '2', '1', 'WX20160203085132174280', 'HBTK20160204020001045349', '2016-02-04 02:00:02', '2016-02-04 02:00:01', '600.00', '超时未领完');* Z" [+ x8 ^ N7 `
--
( m+ k. K5 W! Q# d BONUSID number(11) ,$ l v) l" \3 E9 @' d0 D
DELETEFLAG number(2) ,
, G [; C/ y8 {7 Y+ _ TYPE number(2) ,9 R, s# p, P+ _' G
); ~; G4 q5 K2 m
CREATE TABLE bonususer (
r- N) ]- z! {7 t, u--
" j( G# z! {& ?9 o5 t @" b SENDUSERID number(11) ," v; M$ @8 F. T& e
SENDUSERNAME varchar2(32) ,
9 ^# ?9 k: ^0 ?8 t0 X: P) ` BONUSTICKETNO varchar2(32) ,
( v3 M6 R9 J+ F% N. y7 E g- k9 j/ T); 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');
" c& J8 L9 j tINSERT 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');
: n% z" V1 i) @5 U c0 V--2 E7 S ^: V Y2 J& c4 W
receiveUserId number(11) NOT NULL,! Q8 \$ j5 ?8 k
deleteFlag number(1) NOT NULL ,
) f, d1 \; D/ V/ T createTime date ,
% a* W/ x& H C! ?); INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');
* m J1 Q' N0 g1 N! C3 ] \INSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');& ?+ A. J" E7 n9 R8 p6 O
要求:) Y3 ?- T$ B1 g8 f
使用sed删除以)开头的行的上一行末尾的逗号
* \# L, D0 n- K% t苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。 答案:
9 G' u2 v3 Y; V7 P$ P/ P( P[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file6 W% }( y/ j8 E6 M
20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');
$ u0 Y& V0 y: K" b s5 n/ CINSERT INTO bonusreturnorder VALUES ('50', '254', '697', '2', '1', 'WX20160203085132174280', 'HBTK20160204020001045349', '2016-02-04 02:00:02', '2016-02-04 02:00:01', '600.00', '超时未领完');
; A" z. N5 \# V" t9 W--
1 y* }8 f6 [! P, t; d& j5 K BONUSID number(11) ,% f" `0 [; O9 Q- m6 G
DELETEFLAG number(2) ,3 p5 V: s+ j& R
TYPE number(2)
% E' U6 }" o O P& E);
- U- Y# S' p( E3 yCREATE TABLE bonususer (
* y0 x( B& D$ ]) o( Z5 x* G--* m; h/ I$ l, V7 f
SENDUSERID number(11) ,
2 P% i# I, ?4 J+ V P' q, Q; \ SENDUSERNAME varchar2(32) ,, z9 y" S7 ]+ y
BONUSTICKETNO varchar2(32) 2 ~- f% O- t8 A8 b
);
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');, v0 I) h/ _ c: N* \ }( v
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');+ a, W6 E6 \( @8 Q w* A
--
4 H+ T r+ O9 R( O, l" B# X; { receiveUserId number(11) NOT NULL,7 z) n& N; l8 P$ m& L9 _$ F; F
deleteFlag number(1) NOT NULL ,
Q- w1 |; G( D( o$ F7 I& g s createTime date 4 Z+ Z, ~1 E N( a# b7 O5 O
); INSERT INTO rb_bon6 S8 v1 e8 K, E, E& m
1 ^$ x8 O* H5 u) V$ v% E- J- }解释:
1 R9 i6 H% Y( t/ u# K\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)* `- X H: r6 }+ ~/ I, q. C; t* Y
\s*就是有0到n个空格或\n+ O; q9 Q( N; F4 }
/,/{}只要找到“,”就执行{}里的语句# s+ i- ^3 M4 @$ s7 i7 L4 B
:loop就是个标识,bloop 就是跳转到:loop& Z* z, {; r& O) F, i, V2 E
N是把下一行加入模式空间
$ @# j) ~, l+ M9 y/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句
* c- x6 B9 v9 S7 \s/,\s*)/\n)/ 就是去掉“,”号
8 D( |4 G7 [0 u: M8 D, n |