免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2751 | 回复: 10
打印 上一主题 下一主题

带范围的模式匹配+增加内容,真是头痛 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-14 22:32 |只看该作者 |倒序浏览
Dear all

    目前有遇到一个问题,请各位大虾帮忙

   需求

  1.    UPDATE xxx_file set col1=value1,
  2.                                     col2=value2,
  3.                                     ......
  4.       WHERE.......
  5.      IF SQLCA.sqlcode THEN
  6.          CALL cl_err.....
  7.          ............
  8.      END IF
复制代码

我希望能够找到文件中类似有这样的语句块,即UPDATE开头,UPDATE语句结束后,立即是IF SQLCA.sqlcode这样的STATEMENTS BLOCK
1.在IF SQLCA.sqlcode后面加上一行CALL cl_err3(.....)的语句
2.最好可以提取UPDATE语句后面的xxx_file,因为cl_err3中我会用到这个内容
3.最好能MARK住CALL cl_err这行

可能出现的情况UPDATE结束之后,若不是IF SQLCA.sqlcode的话,这些行就不匹配了
1.我尝试用sed,但是它的单行匹配,
sed "s:\(^ *\)\(UPDATE *\)\([^ (]*\)\(.*\):\1\2\3\4\n      CALL cl_err3(\"upd\",\"\3\",\"\",\"\",SQLCA.sqlcode,\"\",\"\",1)
目前我仅做到UPDATE后面加cl_err3这样子,xxx_file我是提取到了
但是问题是没有CHECK是否有IF SQLCA.sqlcode这样的判断
效果

  1.             UPDATE gac_file SET xxx01 = ....,
  2.        CALL cl_err3("upd","gac_file","","",SQLCA.sqlcode,"","",1)  #No.FUN-660081  #我加的一行,当然我目前的加法,SQL语句肯定不能执行
  3.                                              xxx02 = ....,
  4.                 WHERE gac01 = g_gab01_t AND gac12 = g_gab11_t                  
  5.             IF SQLCA.sqlcode THEN                                               
  6.                 CALL cl_err('gac',SQLCA.sqlcode,0) CONTINUE WHILE               
  7.             END IF
复制代码


2.我尝试用ex命令
ex...
1
/UPDATE/                                                                        
.,/SQLCA.sqlcode/a                                                              
        CALL cl_err3("upd","aaa_file",g_aaa.aaa01,"",SQLCA.sqlcode,"","",1) #No.
.
这种方法的话,a)我无法提取到update后面的xxx_file
                   b)最终的效果是有些加了cl_err3,有些没有加cl_err3
因为ex我不熟,所以不知道为什么出现这种原因了

论坛徽章:
0
2 [报告]
发表于 2006-06-15 09:03 |只看该作者
没人回应噢

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2006-06-15 09:10 |只看该作者
俺读了两遍,没看懂你要的是什么,谁看懂了再描述一下

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
4 [报告]
发表于 2006-06-15 09:11 |只看该作者
语句之间有没有特定的分隔符?
如果是靠语法分析来区分的,就不好办了。

论坛徽章:
0
5 [报告]
发表于 2006-06-15 10:44 |只看该作者
目前我们家要对整个系统的程序中的报错信息要翻新
原来的报错代码是cl_err('description',错误代码,停留秒数)
目前类似在UPDATE/SELECT/INSERT/DELETE(SQL语句后面的报错信息cl_err)的要变换成cl_err3
即把原来的那行cl_err(....) mark住,mark符为 #
再加上一行cl_err3('sel/upd/ins/del',table_name,key_column1,key_column2,错误代码,"","description","",1""


如看懂了上面的话,再看下面的限制
一般什么时候会报错呢,当然是SQL语句有出错时,所以我们家现在的语句类似是这样的:
UPDATE xxx_file set xx=xx,
                                yy=yy..
  WHERE ......
IF SQLCA.sqlcode THEN
    call cl_err(......)
    ......
END IF

所以遇到类似上述的语句块时,我要在1.mark call cl_err(....)
2.在call cl_err(....) 下面新增一行call cl_err3

如果目前还看得懂的话,请再看下面
cl_err3('sel/upd/ins/del',table_name,key_column1,key_column2,错误代码,"","description","",1""
cl_err3中有很多的参数
1.sel/upd/ins/del  则要看上面的一句sql语句,来决定填什么的
2.table_name 要看sql语句处理的table是哪个
3.key_column1,key_column2 目前这个太难了,暂不处理,理论上我会去取where中等号右边的值,最多为两个
4.错误代码为原来cl_err中第二个参数
5.description为原来cl_err中第一个参数,目前这个暂不处理,因为会根据cl_err中第一个参数不同而不同

我原本想用ex来处理,但是这个命令我不熟,且我提取不到相关的信息,用sed可以提取原来cl_err中或是SQL语句中的相关信息,但是目前我处理下来效果也太差
**不知道是不是可以写c呢?????**

**各位有没有被我说糊涂了,**
anyway,谢谢各位的关注

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
6 [报告]
发表于 2006-06-15 11:19 |只看该作者
awk '
/UPDATE/{ac="upd";tname=$2}
/SELECT/{ac="sel";tname=$2}
/INSERT/{ac="ins";tname=$2}
/DELETE/{ac="del";tname=$2}
/IF SQLCA/{pro=1}
/END IF/{pro=0}
pro==1&&/call cl_err/{ print "#mark by awk#",$0;
gsub(/^[^,]*/;"");gsub(/,.*/;"");
print "cl_err3(\047)"ac"\047,"tname",key_column1,key_column2,"$0",\"\",\"description\",\"\",1\"\")"
} ' ur-file

没测试,基本思路就是这样

论坛徽章:
0
7 [报告]
发表于 2006-06-15 13:49 |只看该作者
gsub这行报错,可否解释一下
如果去掉该行,我原来程序很多东西都不见了

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
8 [报告]
发表于 2006-06-15 14:17 |只看该作者
awk '
/UPDATE/{ac="upd";tname=$2}
/SELECT/{ac="sel";tname=$2}
/INSERT/{ac="ins";tname=$2}
/DELETE/{ac="del";tname=$2}
/IF SQLCA/{pro=1}
/END IF/{pro=0}
pro==1&&/call cl_err/{ print "#mark by awk#",$0;
gsub(/^[^,]*/,"");gsub(/,.*/,"");
print "cl_err3(\047)"ac"\047,"tname",key_column1,key_column2,"$0",\"\",\"description\",\"\",1\"\")"
}
!(pro==1&&/call cl_err/)
' ur-file

关键是要读懂,我没你的数据,也不太清楚你的细节要求,抄过去用JB上是完不了工的

论坛徽章:
0
9 [报告]
发表于 2006-06-15 21:14 |只看该作者
谢谢waker,慢慢得成型了
目前我把代码修改成

  1. #!/bin/sh                                                                       
  2. awk '                                                                           
  3. /UPDATE/{ac="upd";tname=$2}                                                     
  4. /SELECT/{ac="sel";tname=$4}                                                     
  5. /INSERT/{ac="ins";tname=$3}                                                     
  6. /DELETE/{ac="del";tname=$3}                                                     
  7. /IF SQLCA/{pro=1}                                                               
  8. /IF STATUS/{pro=1}                                                              
  9. /END IF/{pro=0}                                                                 
  10. pro==1&&/CALL cl_err/{print "#",$0,"  #No.FUN-660115";                          
  11. gsub(/^[^,]*/,"");gsub(/,.*/,"");                                               
  12. print "         CALL cl_err3(\""ac"\",\""tname"\",\"\",\"\",SQLCA\.sqlcode,\"\",
  13. }                                                                              
  14. !(pro==1&&/CALL cl_err/)                                                        
  15. ' sample >try.txt
复制代码


原始文件,sample长成

  1.       INSERT INTO qcs_file VALUES (g_qcs.*)                                    
  2.       IF SQLCA.sqlcode THEN                                                     
  3.          CALL cl_err(g_qcs.qcs01,SQLCA.sqlcode,1)                              
  4.          LET g_success='N'                                                      
  5.       END IF                                                                    
  6.                                                                                 
  7.          UPDATE srg_file SET srg12=g_qcs.qcs01 WHERE srg01=g_qcs.qcs01         
  8.                                                  AND srg02=g_qcs.qcs02         
  9.          IF SQLCA.sqlcode OR SQLCA.sqlerrd[3]=0 THEN                           
  10.             CALL cl_err(g_qcs.qcs01,SQLCA.sqlcode,1)                           
  11.             LET g_success='N'                                                   
  12.          END IF                                                                 
  13.                                                                                 
  14.                SELECT occ02 INTO m_pmc03                                       
  15.                  FROM occ_file                                                  
  16.                 WHERE occ01 = g_qcs.qcs03                                       
  17.                IF STATUS THEN                                                   
  18.                   CALL cl_err(g_qcs.qcs03,'atm-333',0)                          
  19.                   NEXT FIELD qcs03                                             
  20.                END IF                                                           
  21.                                                                                 
  22.             DELETE FROM qct_file                                                
  23.              WHERE qct01 = g_qcs.qcs01
  24.                AND qct02 = g_qcs.qcs02                                          
  25.                AND qct021= g_qcs.qcs05                                          
  26.                AND qct03 = g_qct_t.qct03                                       
  27.             IF SQLCA.sqlcode THEN                                               
  28.                CALL cl_err(g_qct_t.qct03,SQLCA.sqlcode,0)                       
  29.                ROLLBACK WORK                                                   
  30.                CANCEL DELETE                                                   
  31.             END IF
复制代码

使用了最上面的代码后,结果长成了

  1.       INSERT INTO qcs_file VALUES (g_qcs.*)                                    
  2.       IF SQLCA.sqlcode THEN                                                     
  3. #          CALL cl_err(g_qcs.qcs01,SQLCA.sqlcode,1)   #No.FUN-660115            
  4.          CALL cl_err3("ins","qcs_file","","",SQLCA.sqlcode,"","",1)  #No.FUN-660
  5.                                                                                 
  6.          LET g_success='N'                                                      
  7.       END IF                                                                    
  8.                                                                                 
  9.          UPDATE srg_file SET srg12=g_qcs.qcs01 WHERE srg01=g_qcs.qcs01         
  10.                                                  AND srg02=g_qcs.qcs02         
  11.          IF SQLCA.sqlcode OR SQLCA.sqlerrd[3]=0 THEN                           
  12. #             CALL cl_err(g_qcs.qcs01,SQLCA.sqlcode,1)   #No.FUN-660115         
  13.          CALL cl_err3("upd","srg_file","","",SQLCA.sqlcode,"","",1)  #No.FUN-660115
  14.                                                                                 
  15.             LET g_success='N'                                                   
  16.          END IF                                                                 
  17.                                                                                 
  18.                SELECT occ02 INTO m_pmc03                                       
  19.                  FROM occ_file                                                  
  20.                 WHERE occ01 = g_qcs.qcs03                                       
  21.                IF STATUS THEN                                                   
  22. #                   CALL cl_err(g_qcs.qcs03,'atm-333',0)   #No.FUN-660115      
  23.          CALL cl_err3("sel","m_pmc03","","",SQLCA.sqlcode,"","",1)  #No.FUN-660115
  24.                                                                                 
  25.                   NEXT FIELD qcs03                                             
  26.                END IF                                                           
  27.                                                                                 
  28.             DELETE FROM qct_file                                                
  29.              WHERE qct01 = g_qcs.qcs01                                          
  30.                AND qct02 = g_qcs.qcs02                                          
  31.                AND qct021= g_qcs.qcs05                                          
  32.                AND qct03 = g_qct_t.qct03                                       
  33.             IF SQLCA.sqlcode THEN                                               
  34. #                CALL cl_err(g_qct_t.qct03,SQLCA.sqlcode,0)   #No.FUN-660115   
  35.          CALL cl_err3("del","qct_file","","",SQLCA.sqlcode,"","",1)  #No.FUN-660
  36.                                                                                 
  37.                ROLLBACK WORK                                                   
  38.                CANCEL DELETE                                                   
  39.             END IF
复制代码

我希望最好的效果能够为

  1.       INSERT INTO qcs_file VALUES (g_qcs.*)                                    
  2.       IF SQLCA.sqlcode THEN                                                     
  3. #        CALL cl_err(g_qcs.qcs01,SQLCA.sqlcode,1)   #No.FUN-660115              
  4.          CALL cl_err3("ins","qcs_file","","",SQLCA.sqlcode,"","",1)  #No.FUN-660
  5.          LET g_success='N'                                                      
  6.       END IF                                                                    
  7.                                                                                 
  8.          UPDATE srg_file SET srg12=g_qcs.qcs01 WHERE srg01=g_qcs.qcs01         
  9.                                                  AND srg02=g_qcs.qcs02         
  10.          IF SQLCA.sqlcode OR SQLCA.sqlerrd[3]=0 THEN                           
  11. #           CALL cl_err(g_qcs.qcs01,SQLCA.sqlcode,1)   #No.FUN-660115           
  12.             CALL cl_err3("upd","srg_file","","",SQLCA.sqlcode,"","",1)  #No.FUN-
  13.             LET g_success='N'                                                   
  14.          END IF                                                                 
  15.                                                                                 
  16.                SELECT occ02 INTO m_pmc03                                       
  17.                  FROM occ_file                                                  
  18.                 WHERE occ01 = g_qcs.qcs03                                       
  19.                IF STATUS THEN                                                   
  20. #                 CALL cl_err(g_qcs.qcs03,'atm-333',0)   #No.FUN-660115         
  21.                   CALL cl_err3("sel","m_pmc03","","",SQLCA.sqlcode,"","",1)  #No
  22.                   NEXT FIELD qcs03                                             
  23.                END IF
  24.                                                                                 
  25.             DELETE FROM qct_file                                                
  26.              WHERE qct01 = g_qcs.qcs01                                          
  27.                AND qct02 = g_qcs.qcs02                                          
  28.                AND qct021= g_qcs.qcs05                                          
  29.                AND qct03 = g_qct_t.qct03                                       
  30.             IF SQLCA.sqlcode THEN                                               
  31. #              CALL cl_err(g_qct_t.qct03,SQLCA.sqlcode,0)   #No.FUN-660115      
  32.                CALL cl_err3("del","qct_file","","",SQLCA.sqlcode,"","",1)  #No.F
  33.                ROLLBACK WORK                                                   
  34.                CANCEL DELETE                                                   
  35.             END IF
复制代码


/)/)
(*.*)

论坛徽章:
0
10 [报告]
发表于 2006-06-15 21:17 |只看该作者
目前我想取原始cl_err(参数1,参数2,参数3)中参数2出来,然后放至cl_err3中目前SQLCA.sqlcode的地方
现在因为我不会取,是被我写死的
用最上面的代码,目前样子已写出来了,不过格式方面还有差一点

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP