|
最近在学习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', '超时未领完');1 i) }3 {% S% J* t
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', '超时未领完');' b2 A6 [# e6 f9 G# ~; \
-- g. Q# G8 M5 P. l
BONUSID number(11) ,
3 ]3 W3 `2 C1 h7 _. l DELETEFLAG number(2) ,' N- v' P2 C8 M; j6 I, F
TYPE number(2) ,( a& h9 M% B3 `7 p# |
); 6 @8 x: U2 q! v1 J1 @1 J
CREATE TABLE bonususer (4 N& f4 S$ d7 y- Z1 L* ~8 P
--
! C7 C4 O- W- h2 |! Y* n3 t& n SENDUSERID number(11) ,
" |2 S( y ^' }4 X$ ?8 b9 B: a. I) x6 j SENDUSERNAME varchar2(32) ,
9 P9 E0 c6 T9 q/ a: h i) G5 x BONUSTICKETNO varchar2(32) ,2 J( }% M2 T1 E0 b% a
); 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');5 {6 x' Z3 g9 M8 e
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');. s5 y+ a3 y5 J" c* Q" O
--9 k- u5 F- L, @" @4 s1 a0 x+ X
receiveUserId number(11) NOT NULL,6 C) ?/ ]& T4 B2 e
deleteFlag number(1) NOT NULL ,
+ j4 u0 `; r# I createTime date ,/ I1 `) y/ s5 w& V( Q
); INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');2 [! k2 H H& M$ m2 }. o
INSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');
: b1 }6 l' [8 T7 x R 要求:
! Z3 a- t5 Z% b* y使用sed删除以)开头的行的上一行末尾的逗号
" l2 W+ f, @- A0 }+ S& T+ U8 e苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。 答案:
# i$ b0 r v# p. S" W# B[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file w" N- R, o! v, P
20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');
+ e4 T/ x: P% G3 ?2 K" Z0 KINSERT 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 @0 v3 e* W5 T# t- W
--
! O/ M4 [! ^# n7 R. [* \4 i BONUSID number(11) ,
2 d; z0 C7 T) e8 C5 s2 I DELETEFLAG number(2) ,1 e. }- f' ?/ D& H0 e/ ` o
TYPE number(2) 5 [% |3 p% C+ S8 c
); 3 v5 ^8 \- M! v, }* V
CREATE TABLE bonususer (5 Y2 J, s0 F6 o
--: ~3 a0 ]5 d4 P' [
SENDUSERID number(11) ,
* k5 g" G0 q- \/ K/ ^# ]4 w; u$ {2 Y) j SENDUSERNAME varchar2(32) ,! I7 b6 S ^; g9 k$ d+ x
BONUSTICKETNO varchar2(32) 4 V8 M. B6 Q$ [6 l, L7 }3 z4 x
); 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');
) \, L; z! A, z4 }& \% r5 b4 UINSERT 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');& I, N9 } d; K! F3 k
--1 W- q8 O" \, m/ W; r
receiveUserId number(11) NOT NULL,8 V& r+ o+ ]8 M; B$ K
deleteFlag number(1) NOT NULL , K! i% B7 q" b4 X% N
createTime date
" U$ ~+ {! t. @& j) U2 d/ X); INSERT INTO rb_bon
0 H1 U( X }8 O9 k7 k0 R4 M7 `5 ?
解释:
3 V; L w# w% ?0 ~; D7 O\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)
2 e& [5 h( E* S\s*就是有0到n个空格或\n
2 U2 }1 g J5 V+ I; k. u0 U5 V3 {/,/{}只要找到“,”就执行{}里的语句2 s) Z' \; ~. v: v r3 f
:loop就是个标识,bloop 就是跳转到:loop0 W& A" G: v6 O' O' _- R. ~* {
N是把下一行加入模式空间
) O0 P% x: {6 p& k' M/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句
# E5 p& u1 q9 e- qs/,\s*)/\n)/ 就是去掉“,”号
) q2 \ @' ?: ` |