我的.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
在显示时不要将它们转换为十六进制表示?
输出应该是,
答案 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
元命令。