psql显示ansi彩色文本

时间:2015-11-23 09:16:02

标签: postgresql shell terminal less psql

我的.psqlrc有以下选项

\setenv LESS '-iMSx4 -FXR'
\setenv PAGER 'less'
\pset pager always

和我想要着色的psql输出是

 {                                                                    +
    \x1B[35m"\x1B[0m\x1B[35mr\x1B[0m\x1B[35m"\x1B[0m: [               +
       \x1B[1m\x1B[92m"\x1B[0m\x1B[32m1\x1B[0m\x1B[1m\x1B[92m"\x1B[0m,+
       \x1B[1m\x1B[92m"\x1B[0m\x1B[32m2\x1B[0m\x1B[1m\x1B[92m"\x1B[0m,+
       \x1B[1m\x1B[92m"\x1B[0m\x1B[32m3\x1B[0m\x1B[1m\x1B[92m"\x1B[0m,+
       \x1B[1m\x1B[92m"\x1B[0m\x1B[32m4\x1B[0m\x1B[1m\x1B[92m"\x1B[0m,+
       \x1B[1m\x1B[92m"\x1B[0m\x1B[32m5\x1B[0m\x1B[1m\x1B[92m"\x1B[0m,+
       \x1B[1m\x1B[92m"\x1B[0m\x1B[32m6\x1B[0m\x1B[1m\x1B[92m"\x1B[0m,+
       \x1B[1m\x1B[92m"\x1B[0m\x1B[32m7\x1B[0m\x1B[1m\x1B[92m"\x1B[0m,+
       \x1B[1m\x1B[92m"\x1B[0m\x1B[32m8\x1B[0m\x1B[1m\x1B[92m"\x1B[0m +
    ]                                                                 +
 }

有没有办法让寻呼机知道\x1B ansi序列,或告诉psql在显示时不要将它们转换为十六进制表示?

输出应该是,

enter image description here

2 个答案:

答案 0 :(得分:1)

可以使用less环境变量告诉LESSOPEN寻呼机过滤其输入文件。

对于您的情况,这可能是脚本的名称,它将所有\x1B更改为ASCII转义字符,例如,

sed -e 's/\x1B/^[/'

(其中^[是文字控件 [字符:使用 control V 时使用文本编辑器插入有助于)。

进一步阅读:

每条评论:如果psql通过管道调用寻呼机,绕过LESSOPEN(适用于文件),则应将寻呼机设置为脚本过滤和分页的组合,例如像

这样的脚本
#!/bin/sh
perl -pe "s|\\\(x..)|chr(hex(\$1))|ge" | less -iMSx4 -FXR

因为如果没有给出文件名,perl将从管道中运行。

修改

仅使用psql而没有外部脚本的解决方案,

\setenv LESS '-iMSx4 -FXR'
\setenv PAGER 'perl -pe \'s|\\\\(x..)|chr(hex($1))|ge\' | less'

答案 1 :(得分:1)

“多合一” psql解决方案:

\o | sed -r 's/\\x1B\[([0-9]+)m/\x1B[\1m/g' | less -R

就这样---不需要其他psql或shell命令。

工作原理

  • \o 。<===可以直接控制stdout
  • | sed -r 's/\\x1B\[([0-9]+)m/\x1B[\1m/g' 。<===。我们完全按照原样重新打印所有转义序列,但是现在将解释为自身而不是文字。 / li>
  • | less -R 。<===。我们将结果明确地移交给less(1)psql不会为我们这样做,因为我们采取了对stdout的控制!)。 less(1)的选项由您决定;只要它们包含-R(或-r),就会发生着色。

可同时输出SELECT\echo元命令。