mysql 注释_用过滤器sed将mysql注释替换

f52404018e5b62d29eeaad5ec4823976.png

用过滤器sed将mysql注释替换

问题

遇到这样的问题:我使用了某种工具生成出sql代码,生成出的代码是这样的:

DROP TABLE IF EXISTS FOO_TB;
CREATE TABLE FOO_TB(
    f1  varchar(20)  NOT NULL  COMMENT '注释1',
    f2  varchar(200)  NULL  COMMENT '注释2',
    f3  varchar(500)  NOT NULL  COMMENT '类型',
    f4  varchar(4000)  NOT NULL  COMMENT '内容',
    f5  varchar(40)  NOT NULL  COMMENT '省份',
    f6  varchar(20)  NOT NULL  COMMENT '日期',
    f7  varchar(50)  NULL  COMMENT '号码',
    f8  varchar(200)  NULL  COMMENT '名称')
COMMENT = '表';

这是mysql的sql,然而实际我要放到Sybase中运行这样的sql语句。我仍想保留注释内容,也就是说换成/*COMMENT '注释1'*/这种,如何替换?

39b04543125d2fa4d425c7749f1035fb.png

使用sed过滤器

考虑使用Linux下的sed命令来解决此类文本过滤问题。 观察我们要替换的内容,分为两类,第一类是NOT NULL COMMENT '注释',要替换成NOT NULL /*COMMENT '注释1'*/, sed基本使用差不多是sed s/要替换内容/替换后内容/g,这里我们遇到的要转义地方比较多,换成sed s#要替换内容#替换后内容#g,这里的#换成!也可以。 另外,我们遇到还要使用到正则匹配的内容,匹配之前的注释在我们匹配后依然也要把它加上,这就涉及到捕获组的概念,1是捕获组 ,就是第一个小括号内的值。 我们用.*来匹配注释,同时用一对转义括号()把它们扩起来,在后面用1再得到注释内容。我们使用-i命令使它原地替换。替换命令如下

sed -i "s#COMMENT '(.*)'([,)])#/*COMMENT 1*/2#g" test.sql

我们另外一类要替换的是COMMENT = '表';,也就是后面接分号的。这么替换:

sed -i "s#(COMMENT = )'(.*)';#/*12*/;#g" test.sql

将多条sed命令合起来

sed提供了-e选项,可以两条合并成一条,sed后面接-i和-e选项之后接两个引号引起来的正则表达式后面接文件名。

处理多文本情形

我使用的生成sql语句的工具一次会生成多个脚本,建表脚本会以[建表脚本]开头,我们可以用[建表脚本]*.sql去匹配所有建表脚本文件。

终极注释替换脚本

于是,我们得到最终的sed语句,以下语句可以把Mysql类型的COMMENT '注释1'换成用/**/包裹注释内容的sql语句,从而用到sybase数据库上来建表。

sed -i -e "s#COMMENT '(.*)'([,)])#/*COMMENT 1*/2#g" -e "s#(COMMENT = )'(.*)';#/*12*/;#g" [建表脚本]*.sql

效果:

28ee7b9c64fb83126ca8603891427027.png

参考资料

  • Unix & Linux大学教程(Harley Hahn's Guide to Unix and Linux)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值