如何在perl one liner中进行无缓冲替换?

时间:2012-11-19 10:41:54

标签: perl

我有一个包装mvn(Apache Maven)的bash脚本,为其输出添加颜色。它的缩减版本是:

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

其中$bldblu是粗体蓝色的ANSI颜色转义字符,$rst重置颜色。

我遇到的问题是有时候mvn会写一行不以换行结束的行,因此(据我所知)sed一直在等待输入并且从不打印提示符(这使得它看起来像Maven挂了)。我已经尝试将-u添加到sed中,但这只是强制sed进行逐行缓冲而不是缓冲多行 - 对我没有帮助。

到目前为止,这是我提出的:

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

但我认为-p的使用在这里不正确。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

替换可能过度,特别是当替换模式中包含特殊字符时。怎么样?

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

或者不是重新发明轮子

mvn "$@" | perl -MTerm::ANSIColor -pe 
    '$_=color("bold blue").$_.color("reset") if /^.INFO. -/'