Shell在代碼重構中的應用瞭解下



代碼重構(Code refactoring)有時是很枯燥的,字符串替換之類的操做不只乏味,並且還容易出錯,好在有一些工具可用,以PHP爲例,如:Rephactor,Scisr等等,不過現成的工具每每意味着不夠靈活,因此今天我要說說Shell在代碼重構中的應用。php

先來個簡單的,假設咱們要把PHP文件中的foo_bar全都替換成fooBar,那麼能夠以下:laravel

方法一,使用Sed:sql

1shell> find /path -name "*.php" -print0 | xargs -0 sed ' 2 s/foo_bar/fooBar/g 3 '
複製代碼

方法二,使用AWK:shell

1shell> find /path -name "*.php" -print0 | xargs -0 awk ' 2 { 3 gsub(/foo_bar/, "fooBar") 4 print 5 } 6 '
複製代碼

注:爲了簡單,我把結果直接打印到終端屏幕了,至於如何保存,稍後會說明。bash

接着說個複雜的:假設某個PHP項目,之前使用類以前必須調用一個叫『includeClass』的方法,如今改用類自動加載的方式,因此要刪除硬編碼的includeClass調用,出於美觀的考慮,若是includeClass下面一行是空行的話,也一塊兒刪除,同時考慮大小寫不敏感的因素。服務器

重構前的代碼示例:架構

101 <?php
 202 includeClass('...');
 303 echo 'a';
 404
 505 echo 'b';
 606 includeClass('...');
 707 includeClass('...');
 808
 909
1010 echo 'c';
1111
1212 echo 'd';
1313 includeClass('...');
1414
1515
1616 echo 'e';
1717 ?>
複製代碼

重構後的代碼示例:併發

101 <?php
 202 echo 'a';
 303
 404 echo 'b';
 505
 606 echo 'c';
 707
 808 echo 'd';
 909
1010 echo 'e';
1111 ?>
複製代碼

在動手前,咱們須要先摸摸底,瞭解一下大概的狀況:分佈式

1shell> grep -I -ri includeClass /path | more
複製代碼

其中,grep命令的參數乍一看很差記,不過只要按照我說的方法記,就永遠不會忘:前面的參數看作英文,後面的參數看作拼音🙂。至於參數的具體含義,請參閱man文檔。svn


方法一,使用Sed編寫腳本script.sh:

1#!/bin/bash
 2
 3for PHP in $@; do
 4    /bin/sed -i ' 5 /includeClass/I { 6 h 7 d 8 } 9 10 /^$/ { 11 x 12 /includeClass/Id 13 x 14 } 15 16 h 17 ' $PHP
18done
複製代碼

注:篇幅所限,我把正則寫的比較簡單

Sed的缺點是代碼可讀性比較差,優勢是代碼較短。另外內置的『-i』選項能夠直接完成保存,這是我喜歡Sed的緣由之一。

方法二,使用AWK編寫腳本script.sh:

1#!/bin/bash
 2
 3for PHP in $@; do
 4    TMP=$(mktemp)
 5
 6    /bin/awk ' 7 BEGIN { 8 IGNORECASE = 1 9 } 10 11 /includeClass/ { 12 previous = $0 13 next 14 } 15 16 /^$/ { 17 if (previous ~ /includeClass/) { 18 previous = $0 19 next 20 } 21 } 22 23 { 24 previous = $0 25 print 26 } 27 ' $PHP > $TMP
28
29    /bin/cp -f $TMP $PHP
30    /bin/rm -f $TMP
31done
複製代碼

注:篇幅所限,我把正則寫的比較簡單

AWK的缺點是代碼比較長,優勢是代碼可讀性較好。另外程序中是經過生成一個惟一的臨時文件來完成保存的。

提醒:直接覆蓋原始文件有時候並不合適,畢竟可能有沒考慮周詳的地方,使用SVN的話就不會有這樣的顧慮了,由於即使覆蓋了原始文件,也能夠在提交前經過「svn diff」命令來檢查對錯,就算是提交了,也能夠恢復到之前的版本。

如何調用script.sh腳本呢?這裏給個最通常的例子:

1shell> find /path -name "*.php" -print0 | xargs -0 /path/to/script.sh
複製代碼

簡單的任務用Sed寫很合適,複雜的任務則最好用AWK寫,具體能夠參考Sed One Line和AWK One Line等。


不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們,須要的加羣(點擊→)此處個人官方羣

相關文章
相關標籤/搜索