2

我有一个包装 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这里的使用不正确。有什么帮助吗?

4

2 回答 2

0

替换可能是多余的,尤其是当替换模式中包含特殊字符时。这个怎么样?

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. -/'
于 2012-11-19T16:17:00.367 回答
0

(解决方法)使用 sed --unbuffered

我无法弄清楚解决方案,但幸运的是,这对于我的特定用途来说已经足够了:

cat - | sed --unbuffered 's/.*?from//'

但我也想知道答案。Perl 单行替换是我工具中的一个关键习惯用法。

于 2022-01-29T03:57:21.430 回答