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