psql 显示 ansi 彩色文本

psql displaying ansi colored text

我的 .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 在显示时不要将它们转换为十六进制表示?

输出应该是这样的,

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

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

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

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

进一步阅读:

根据评论:如果 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())|ge\' | less'

一个“all-in-one”psql解决方案:

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

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

工作原理

  • \o <=== 让我们直接控制 stdout.
  • | sed -r 's/\x1B\[([0-9]+)m/\x1B[m/g' <=== 我们 re-print 所有的转义序列都原封不动,但现在将 解释为它们自己和不是文字.
  • | less -R <=== 我们明确地将结果交给 less(1)psql 不会这样做我们,因为我们接管了 stdout!)。 less(1) 的选项由您决定;只要它们包含 -R(或 -r),就会发生着色。

适用于 SELECT\echo meta-commands.

的输出