4

.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 +
    ]                                                                 +
 }

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

输出应该是这样的,

在此处输入图像描述

4

2 回答 2

3

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

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

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

(其中 the^[是文字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($1))|ge\' | less'
于 2015-11-23T10:24:00.127 回答
3

“一体式”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'     <=== 我们按照原样重新打印所有转义序列,但现在解释为它们本身而不是文字
  • | less -R     <=== 我们将结果less(1)明确地交给(psql不会为我们做这件事,因为我们接管了stdout!)。提供的选项less(1)取决于您;只要它们包含-R(或-r),就会发生着色。

适用于SELECTs 和\echo元命令的输出。

于 2020-10-15T13:16:51.500 回答