2012-11-19 51 views
2

我已經有了一個bash腳本來封裝mvn(Apache Maven)來爲其輸出添加顏色。是做什麼的一個簡化版本是:如何在perl上進行無緩衝替換?

mvn "[email protected]" | sed -e "s/^\[INFO\] \-.*/$bldblu&$rst/g" 

其中$bldblu是大膽的藍色的ANSI顏色轉義字符,並$rst重置顏色。

我遇到的問題是,有時mvn寫了一行不以換行符結束的行,因此(據我所知)sed一直在等待輸入,並且從不打印提示(這使得它看起來像Maven掛着)。我已經嘗試將-u添加到sed,但這只是強制sed執行逐行緩衝而不是緩衝多行 - 對我沒有幫助。

到目前爲止,這是我想出來的:

mvn "[email protected]" | perl -pe "$| = 1; s/^(\[INFO\] \-.*)/$bldblu\$1$rst/g" 

,但我覺得用-p是不正確的位置。任何幫助?

+1

是你看到具體的什麼問題? –

+1

它不打印mvn的最後一行,因爲它沒有以換行符/回車符結束 –

+1

我還沒有完全理解這個問題,但是如何嘗試/ gs或/ gsm或/ gm修飾符(而不是/ g)? – knb

回答

1

替換可能是矯枉過正,尤其是當替換模式中有特殊字符時。這個怎麼樣?

export bldblu 
export rst 
mvn "[email protected]" | perl -pe 'if(/^.INFO. -/){ $_=$ENV{bldblu}.$_.$ENV{rst} }' 

或而非另起爐竈

mvn "[email protected]" | perl -MTerm::ANSIColor -pe 
    '$_=color("bold blue").$_.color("reset") if /^.INFO. -/' 
+1

成功着色該行,但它不能解決緩衝問題。至於我可以告訴問題是'-p'用'while(<>){...}'和'while(<>)'進程爲每一行包裝程序,所以一條不終止的行直到它不被處理。不幸的是。 –

+0

緩衝區有什麼問題,除非'mvn'程序餓死輸入了?你應該用一個簡單的'mvn「$ @」 mob

+0

是的,在我的用例中它有時會提示輸入,這就是問題所在。 –