|
最近在学习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', '超时未领完');) e6 J1 U1 J! \0 S: O" z
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', '超时未领完');6 ^% ?: Z) W3 v9 F8 A: |
--, p, I2 B! {7 u6 q: V: ?$ n; x) y
BONUSID number(11) ,8 |, F; f* s7 d: Q* t7 @5 }
DELETEFLAG number(2) ,2 t6 ?! S) h: B8 Z- u2 v( ^
TYPE number(2) ,
0 y5 w! e2 Z& ]' @4 g7 });
& O r/ D9 |& y- z# lCREATE TABLE bonususer (+ Y9 G$ ^7 u: e% g" b4 Z7 ~# b
--4 v) C5 }, x: u( d
SENDUSERID number(11) ,
" J; k+ A) N: P) ^ SENDUSERNAME varchar2(32) ,: V8 ~% i; [% m
BONUSTICKETNO varchar2(32) ,
4 q2 o$ m7 E2 s0 x/ b6 @5 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');- @3 S; p3 }5 n$ j, 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');; r: I; e! f" N' ?+ }' z- f
--
# ]. u f* l: E4 p9 F$ \; `+ l receiveUserId number(11) NOT NULL,6 U6 m$ b2 V8 G$ u! Z8 l- h7 ?+ Q
deleteFlag number(1) NOT NULL ,
. W/ L1 u7 e7 L, b6 D1 Y- o3 o createTime date ,6 `& j0 s3 D; n8 d; {$ e! S( v
); INSERT INTO rb_bonustouser VALUES ('97154', '8515718', '239473', '1', '2017-01-11 19:28:16');/ c6 o6 m8 u E
INSERT INTO rb_bonustouser VALUES ('97156', '8515718', '11326', '1', '2017-01-11 19:28:16');
' [5 P* e1 k' K. Y$ S 要求:# N* m" F9 {1 f: Z3 Q
使用sed删除以)开头的行的上一行末尾的逗号8 y3 D! x+ K( x( K
苦恼了我两个晚上也没搞定,期间也参考了网上一些大神的博客和GNU官网sed命令的详解。最终选择在CSDN上发帖求助文本处理大神,迎刃而解。在此感谢大牛 “代码誉写工”。 答案:/ b4 k7 w* z/ M5 H! w
[pc@S5 ~]$ sed '/,\s*$/{:loop; N; /,\(\s*\|\n\))/! bloop; s/,\s*[\n]\?\s*)/\n)/}' file
) D2 x$ M8 v4 I: j/ h* _6 H20000110119', '2016-02-04 02:00:01', '2016-02-04 02:00:00', '1200.00', '超时未领完');. Z8 b3 T D5 a
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', '超时未领完');
' T" J! S2 T3 P--5 [: N5 ]7 K' N3 P& }
BONUSID number(11) ,$ m( }! R3 a0 d# V9 V2 v9 f
DELETEFLAG number(2) ,
5 I0 i7 D( E( ]' r% c a: | TYPE number(2) ) W( H+ w* x" K7 e. p! M
);
' s+ E. K% U! v9 `: A% X& DCREATE TABLE bonususer (
" n' q1 N6 z( c! {6 v/ s6 ]--+ @% f Y( a- f$ z" ^; W( `
SENDUSERID number(11) ,
0 |/ K% g2 ^ ^ SENDUSERNAME varchar2(32) ,9 t! f5 x8 ?" N: E6 a! X/ q
BONUSTICKETNO varchar2(32) 0 V. \7 O( G5 v$ n. z" 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');
7 y3 E8 d. D% D( ]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 X2 ?' h( Q: A
--
+ g6 K" E; Z' S: }7 U receiveUserId number(11) NOT NULL,
9 I2 f% `/ C7 n0 Q) l$ s% x8 R deleteFlag number(1) NOT NULL ,2 x3 p. W, w7 A, e: j* Y5 h0 Z
createTime date : a' t' [ L2 S+ m3 F2 D- d' z7 e
); INSERT INTO rb_bon5 s- [3 N* N3 o, m( ?6 B
$ d9 n/ x! s# I2 d- D$ S
解释:* u4 d* s0 _" y
\s匹配空格、制表符、换行、回车,也就是\s其实也匹配\n(多行模式的每行结尾)
! D- d& R2 |. ^ X% S; y\s*就是有0到n个空格或\n8 G- A1 h6 k2 v
/,/{}只要找到“,”就执行{}里的语句
0 A1 Z. R! o% _6 I$ L. A3 a:loop就是个标识,bloop 就是跳转到:loop
: C$ b! Z( s* Z2 IN是把下一行加入模式空间
9 S% q( Y* Z1 G. B/.\s*)/! bloop是如果模式空间发现了“, )”(这个“,”和“)”之间也许有n多个空格和回车,但没有其它字符),就不再执行:loop,也就是不N,而是执行bloop后的语句
/ N0 @( F% @5 f: F7 o8 D& L2 v$ as/,\s*)/\n)/ 就是去掉“,”号
* L* r& V1 J/ I$ B$ }; Q+ S |