说说Shell在代码重构中的应用

出处信息

出处:http://blogread.cn/it/article/3426?f=wb

代码重构(Code refactoring)有时是很枯燥的,字符串替换之类的操作不仅乏味,而且还容易出错,好在有一些工具可用,以PHP为例,如:Rephactor,Scisr等等,不过现成的工具往往意味着不够灵活,所以今天我要说说Shell在代码重构中的应用。

先来个简单的,假设我们要把PHP文件中的foo_bar全都替换成fooBar,那么可以如下:

方法一,使用Sed:

shell> find /path -name "*.php" | xargs sed 's/foo_bar/fooBar/g'

方法二,使用AWK:

shell> find /path -name "*.php" | xargs awk '{ gsub(/foo_bar/, "fooBar"); print; }'

注:为了简单,我把结果直接打印到终端屏幕了,至于如何保存,稍后会说明。

接着说个复杂的:假设某个PHP项目,以前使用类之前必须调用一个名为“includeClass”的方法,现在改用类自动加载的方式,所以要删除硬编码的includeClass调用,出于美观的考虑,如果includeClass下面一行是空行的话,也一起删除,同时考虑大小写不敏感的因素。

重构前的代码示例:

01 <?php
02 includeClass('...');
03 echo 'a';
04
05 echo 'b';
06 includeClass('...');
07 includeClass('...');
08
09
10 echo 'c';
11
12 echo 'd';
13 includeClass('...');
14
15
16 echo 'e';
17 ?>

重构后的代码示例:

01 <?php
02 echo 'a';
03
04 echo 'b';
05
06 echo 'c';
07
08 echo 'd';
09
10 echo 'e';
11 ?>

在动手前,我们需要先摸摸底,了解一下大概的情况:

shell> grep -I -ri includeClass /path | more

其中,grep命令的参数乍一看不好记,不过只要按照我说的方法记,就永远不会忘:前面的参数看做英文,后面的参数看做拼音  。至于参数的具体含义,请参阅man文档。

方法一,使用Sed编写脚本script.sh:

#!/bin/shfor PHP in $@; do/bin/sed -i '/includeClass/I {hd}/^$/ {x/includeClass/Idx}h' $PHP
done

注:篇幅所限,我把正则写的比较简单

Sed的缺点是代码可读性比较差,优点是代码较短。另外内置的“-i”选项可以直接完成保存,这是我喜欢Sed的原因之一。

方法二,使用AWK编写脚本script.sh:

#!/bin/shfor PHP in $@; doTMP=$(mktemp)/bin/awk 'BEGIN {IGNORECASE = 1}/includeClass/ {previous = $0next}/^$/ {if (previous ~ /includeClass/) {previous = $0next}}{previous = $0print}' $PHP > $TMP/bin/cp -f $TMP $PHP/bin/rm -f $TMP
done

注:篇幅所限,我把正则写的比较简单

AWK的缺点是代码比较长,优点是代码可读性较好。另外程序中是通过生成一个唯一的临时文件来完成保存的。

提醒:直接覆盖原始文件有时候并不合适,毕竟可能有没考虑周详的地方,使用SVN的话就不会有这样的顾虑了,因为即便覆盖了原始文件,也可以在提交前通过“svn diff”命令来检查对错,就算是提交了,也可以恢复到以前的版本。

如果调用script.sh脚本呢?这里给个最一般的例子:

shell> find /path -name "*.php" | xargs /path/to/script.sh

简单的任务用Sed写很合适,复杂的任务则最好用AWK写,实战是学习的最好方法,具体可以参考Sed One Line和AWK One Line等资料。

说明:本文用到的Sed和AWK均指GNU版本。

转载于:https://www.cnblogs.com/leonxyzh/p/7289051.html

说说Shell在代码重构中的应用相关推荐

  1. php代码重构,Shell在代码重构中的应用了解下

    代码重构(Code refactoring)有时是很枯燥的,字符串替换之类的操作不仅乏味,而且还容易出错,好在有一些工具可用,以PHP为例,如:Rephactor,Scisr等等,不过现成的工具往往意 ...

  2. 代码重构中的几个概念

    最近使用SourceMonitor工具做代码优化,过程中对一些原来耳熟能详的名字现在有点模糊了.这里记录一下. 函数复杂度,这里一般指的是函数圈复杂度.(Function Complexity) 概念 ...

  3. mysql备份脚本 shell_linux中mysql备份shell脚本代码 相关自动化脚本

    linux下监视进程 崩溃挂掉后自动重启的shell脚本 如何保证服务一直运行?如何保证即使服务挂掉了也能自动重启?在写服务程序时经常会碰到这样的问题.在Linux系统中,强大的shell就可以很灵活 ...

  4. 阿里面试官:你在工作中是如何做代码重构的?

    我是猿人,一个热爱技术.热爱编程的IT猿.技术是开源的,知识是共享的! 写作是对自己学习的总结和记录,如果您对 Java.分布式.微服务.中间件.Spring Boot.Spring Cloud等技术 ...

  5. 代码重构之路 --我的2022年总结

    2022年是我正式参加工作的第10个年头,也是我在CSDN上写博客的第11个年头.在这10余年的时间里,虽然在工作上遇到了各种情况,但我一直坚持输出.坚持分享,一共在CSDN上发表了530多篇原创博文 ...

  6. 把三千行代码重构为15行

    2019独角兽企业重金招聘Python工程师标准>>> 如果你认为这是一个标题党,那么我真诚的恳请你耐心的把文章的第一部分读完,然后再下结论.如果你认为能够戳中您的G点,那么请随手点 ...

  7. 步步为营 .NET 代码重构学习笔记 九

    步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...

  8. CSS代码重构与优化之路

    写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多,如果没有及时对CSS代码进行维护,CSS代码不断会越来越多.CSS代码交错复杂,像一张庞大的蜘蛛网分布在网站的各个位置 ...

  9. QT之计算器代码重构(六)

    首先我们来讲讲为什么要进行代码重构?在一些大的项目中,代码重构是一个必不可少的步骤.因为项目大了,代码也就多了,后期的维护将会很难,所以我们要适当的进行代码重构,让代码的可复用性提高,使软件的设计和架 ...

最新文章

  1. Mask_YOLO_Caffe:基于Mask-RCNN和YOLO检测的工程实现(附源代码)
  2. python去停用词用nltk_使用nltk删除英文停用词
  3. 关于EOF,转自新浪微博
  4. outlook2010客户端无法预览及保存word,excel问题
  5. ES6基础之——对象表达式
  6. MySQL 2006-MySQLserver has gone away
  7. 博客大全被百度标注为风险网站
  8. 桌面云之深信服VDC管理
  9. win7窗口颜色没有透明的解决方法
  10. 信息学竞赛与 计算机科学,在信息学奥林匹克竞赛中我与学生共成长
  11. 投资与创业:程序猿如何改变世界
  12. 从安卓/linux固件反编译出dtb和dts
  13. dba+开源工具:轻量级数据库审计日志平台,违规操作无所遁形(附下载)
  14. ensp 双机热备 配置_【解忧番外篇】基于eNSP USG6000v的双机热备实验
  15. 为什么有必要开发一个APP?
  16. linux默认端口范围是多少?
  17. css特效之openbox
  18. 进化算法可以不再需要计算集群,开普敦大学的新方法用一块GPU也能刷新MNIST记录...
  19. Effective C++之条款20:宁以pass-by-reference-to-const替换pass-by-value
  20. 看雪熊猫前辈——svchost进程的浅析

热门文章

  1. matlab字母随机排列,matlab实现1n整数的一个随机排列
  2. python函数参数定义顺序_Python函数定义-位置参数-返回值
  3. git 开源 java_开源中国GIT中Java分类下TOP10项目的活动情况分析
  4. 中班区域活动设计思路_【年段教研】“小游戏大学问 巧建构促发展” ——石狮实幼中班段年段教研主题建构游戏的组织与开展...
  5. 获取浏览器高度_QQ浏览器违法收集用户信息,你的浏览器还安全吗?
  6. 求两个不超过200位的非负整数积_必看:初一上册数学考试概念、定义全部公式总结!(两个版本)...
  7. ObjectFactory对象工厂类
  8. Vue3.js 全局组价案例入门
  9. Linux添加文件命令
  10. mysql安装8.013_Mysql 8.0.13 安装