说说Shell在代码重构中的应用
說說Shell在代碼重構(gòu)中的應用
出處信息出處:http://blogread.cn/it/article/3426?f=wb
代碼重構(gòu)(Code refactoring)有時是很枯燥的,字符串替換之類的操作不僅乏味,而且還容易出錯,好在有一些工具可用,以PHP為例,如:Rephactor,Scisr等等,不過現(xiàn)成的工具往往意味著不夠靈活,所以今天我要說說Shell在代碼重構(gòu)中的應用。
先來個簡單的,假設我們要把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; }'注:為了簡單,我把結(jié)果直接打印到終端屏幕了,至于如何保存,稍后會說明。
接著說個復雜的:假設某個PHP項目,以前使用類之前必須調(diào)用一個名為“includeClass”的方法,現(xiàn)在改用類自動加載的方式,所以要刪除硬編碼的includeClass調(diào)用,出于美觀的考慮,如果includeClass下面一行是空行的話,也一起刪除,同時考慮大小寫不敏感的因素。
重構(gòu)前的代碼示例:
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 ?>重構(gòu)后的代碼示例:
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命令的參數(shù)乍一看不好記,不過只要按照我說的方法記,就永遠不會忘:前面的參數(shù)看做英文,后面的參數(shù)看做拼音??。至于參數(shù)的具體含義,請參閱man文檔。
方法一,使用Sed編寫腳本script.sh:
#!/bin/shfor PHP in $@; do/bin/sed -i '/includeClass/I {hd}/^$/ {x/includeClass/Idx}h' $PHP done注:篇幅所限,我把正則寫的比較簡單
Sed的缺點是代碼可讀性比較差,優(yōu)點是代碼較短。另外內(nèi)置的“-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的缺點是代碼比較長,優(yōu)點是代碼可讀性較好。另外程序中是通過生成一個唯一的臨時文件來完成保存的。
提醒:直接覆蓋原始文件有時候并不合適,畢竟可能有沒考慮周詳?shù)牡胤?#xff0c;使用SVN的話就不會有這樣的顧慮了,因為即便覆蓋了原始文件,也可以在提交前通過“svn diff”命令來檢查對錯,就算是提交了,也可以恢復到以前的版本。
如果調(diào)用script.sh腳本呢?這里給個最一般的例子:
shell> find /path -name "*.php" | xargs /path/to/script.sh簡單的任務用Sed寫很合適,復雜的任務則最好用AWK寫,實戰(zhàn)是學習的最好方法,具體可以參考Sed One Line和AWK One Line等資料。
說明:本文用到的Sed和AWK均指GNU版本。
轉(zhuǎn)載于:https://www.cnblogs.com/leonxyzh/p/7289051.html
總結(jié)
以上是生活随笔為你收集整理的说说Shell在代码重构中的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 2411 Mondriaan's
- 下一篇: 对session和cookie的一些理解