2010-11-10 44 views
1

我想使用Perl的單行來混淆grep svn diff的一些輸出,所以我可以自動測試這些文件。我們有一個run_test.sh腳本,可以採取與前置多個PHP文件「測試」作爲自己的論據。最好的方法來完成這個Perl的正則表達式單行

到目前爲止,我有它成功地預先考慮以下‘測試’,以文件名

[[email protected] classes]$ svn diff | grep '(revision' | perl -wpl -e 's/(.*)\/(.*)$/$1\/Test$2/' 
--- commerce/TestLCart.php  (revision 104387) 
--- commerce/manufacturing/TestLRoutingData.php (revision 104387) 

現在我只想抓住文件/路徑將它傳遞給我們的run_test.sh,我可以用下面的awk來完成它,但是我正在努力提高我的Perl /單線程技巧。那麼如何修改perl單線程只額外提取文件路徑?

svn diff | grep '(revision' | perl -wpl -e 's/(.*)\/(.*)$/$1\/Test$2/' | awk '{print $2}' | xargs run_test.sh 
+1

偉大的答案是,我一直在關注他們,因爲他們得到修訂。當我重新開始工作並且會接受答案時,明天就會明白。 – 2010-11-11 01:12:30

回答

4

你只是想要的文件名,所以svn st是你想要的。而不是獲得大量的噪音,其中可能包含(revision,以及你想要的主線,你會得到這樣的:M commerce/LCart.php。然後,您可以將\S*(任意數量的非空白字符),然後\s*(任意數量的空白字符)砍掉,並留下剩餘部分。你可以做不同的\S*\s*,但這是獲得所有案例的最簡單方法。

svn st | perl -wpl -e 's|\S*\s*(.*)/(.*)$|$1/Test$2|' 

(交換它使用發佈後小號///送|||所以/不需要進行轉義;好主意,斧頭兵)

2

更好的版本:

  • 沒有默認打印(-n
  • 提取物對
  • print

    perl -wnl -e '($_)=m{---\s+(\S+)} and s|/([^/]+)$|/Test$1| and print "$_\n";' 
    

你不需要awk現在串第一

  • SUBST。並加入'(revision來表達,

    perl -wnl -e '($_)=m{---\s+(\S+)\s+\(revision} and s|/([^/]+)$|/Test$1| and print "$_\n";' 
    

    你不需要grep無論是。

    但我有幾個我創建的顛覆工具,如果你想要的是更改文件'svn st'更好。

    svn st | perl -wnle 'm/^[CM]\s+(\S+)/and$r=rindex($1,"/")+1and print substr($1,0,$r),"Test",substr($1,$r+1),"\n"' 
    

    這次我選擇了rindex + substr方法。現在,有沒有正則表達式回溯。

  • 3

    可以擺脫grepawk相當容易。

    svn diff | perl -wnl -e '/\(revision/ or next; m|(\S+)/(\S+)|; print "$1/Test$2";' 
    

    我將-p改爲-n。 -p表示while (<>) { <your code>; print $_; }和-n是相同的,但沒有print,因爲新版本具有明確的print

    而不是一個s///取代,我使用的m//模式匹配。我改變了分隔符|避免backslashing斜線(傾斜牙籤綜合症的原因)。你幾乎可以使用任何你想要的標點符號。

    \S類似於.但僅匹配非空白字符。你.* S IN模式實際上是匹配行的整個塊斜線前後,但新的模式只有文件的路徑相匹配。由於+是「貪婪」,第一個($1)將獲得更多的字符串時,有在多路徑斜槓,同樣爲您的替代模式。

    相關問題