说说Shell在代码重构中的应用
2013-11-23 13:45
260 查看
说说Shell在代码重构中的应用
出处信息出处:http://blogread.cn/it/article/3426?f=wb
代码重构(Code refactoring)有时是很枯燥的,字符串替换之类的操作不仅乏味,而且还容易出错,好在有一些工具可用,以PHP为例,如:Rephactor,Scisr等等,不过现成的工具往往意味着不够灵活,所以今天我要说说Shell在代码重构中的应用。
先来个简单的,假设我们要把PHP文件中的foo_bar全都替换成fooBar,那么可以如下:
方法一,使用Sed:
[code]shell> find /path -name "*.php" | xargs sed 's/foo_bar/fooBar/g'
方法二,使用AWK:
[code]shell> find /path -name "*.php" | xargs awk '{ gsub(/foo_bar/, "fooBar"); print; }'
注:为了简单,我把结果直接打印到终端屏幕了,至于如何保存,稍后会说明。
接着说个复杂的:假设某个PHP项目,以前使用类之前必须调用一个名为“includeClass”的方法,现在改用类自动加载的方式,所以要删除硬编码的includeClass调用,出于美观的考虑,如果includeClass下面一行是空行的话,也一起删除,同时考虑大小写不敏感的因素。
重构前的代码示例:
[code]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 ?>
重构后的代码示例:
[code]01 <?php 02 echo 'a'; 03 04 echo 'b'; 05 06 echo 'c'; 07 08 echo 'd'; 09 10 echo 'e'; 11 ?>
在动手前,我们需要先摸摸底,了解一下大概的情况:
[code]shell> grep -I -ri includeClass /path | more
其中,grep命令的参数乍一看不好记,不过只要按照我说的方法记,就永远不会忘:前面的参数看做英文,后面的参数看做拼音
![](http://huoding.com/wp-includes/images/smilies/icon_smile.gif)
。至于参数的具体含义,请参阅man文档。
方法一,使用Sed编写脚本script.sh:
[code]#!/bin/sh for PHP in $@; do /bin/sed -i ' /includeClass/I { h d } /^$/ { x /includeClass/Id x } h ' $PHP done
注:篇幅所限,我把正则写的比较简单
Sed的缺点是代码可读性比较差,优点是代码较短。另外内置的“-i”选项可以直接完成保存,这是我喜欢Sed的原因之一。
方法二,使用AWK编写脚本script.sh:
[code]#!/bin/sh for PHP in $@; do TMP=$(mktemp) /bin/awk ' BEGIN { IGNORECASE = 1 } /includeClass/ { previous = $0 next } /^$/ { if (previous ~ /includeClass/) { previous = $0 next } } { previous = $0 print } ' $PHP > $TMP /bin/cp -f $TMP $PHP /bin/rm -f $TMP done
注:篇幅所限,我把正则写的比较简单
AWK的缺点是代码比较长,优点是代码可读性较好。另外程序中是通过生成一个唯一的临时文件来完成保存的。
提醒:直接覆盖原始文件有时候并不合适,毕竟可能有没考虑周详的地方,使用SVN的话就不会有这样的顾虑了,因为即便覆盖了原始文件,也可以在提交前通过“svn diff”命令来检查对错,就算是提交了,也可以恢复到以前的版本。
如果调用script.sh脚本呢?这里给个最一般的例子:
[code]shell> find /path -name "*.php" | xargs /path/to/script.sh
简单的任务用Sed写很合适,复杂的任务则最好用AWK写,实战是学习的最好方法,具体可以参考Sed One Line和AWK
One Line等资料。
说明:本文用到的Sed和AWK均指GNU版本。
相关文章推荐
- Comamnd模式和Factory模式在一次代码重构中的应用
- 老男孩教育每日一题:2017年3月9日-请解释下面Shell脚本中if开头的整行代码的意思及应用场景吗?
- Shell 代码简单应用
- 应用MVP模式对遗留代码进行重构
- Comamnd模式和Factory模式在一次代码重构中的应用
- 重构_改善既有的代码设计(三)
- C#代码重构技巧总结
- iOS 9应用开发教程之使用代码添加按钮美化按钮
- 重构授课班时间安排模块代码
- xfire框架构建webservice应用(通过myeclipse自动生成代码,自动导入xfire jar包,需要用jdk5.0)
- 用mvc的应用管理代码
- 重构实践,优化技能释放代码
- 【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)
- 【Shell】【学习笔记】Linux Shell脚本应用(二)
- jQuery循环滚动展示代码 可应用到文字和图片上
- Android应用自动更新功能的代码实现
- 【Shell】【学习笔记】Linux Shell脚本应用(六)
- SHELL脚本监控JAVA进程的代码
- 简易的深度学习框架Keras代码解析与应用
- 实现shell终端代码分享(可用户登录 实现系统命令)