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 使用文本编辑器插入时有帮助)。
进一步阅读:
- Unix Lesson - Displaying more with "less"
- How can I view log files in Linux and apply custom filters while viewing?
- less(1) 手册页
根据评论:如果 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.
的输出
我的 .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 使用文本编辑器插入时有帮助)。
进一步阅读:
- Unix Lesson - Displaying more with "less"
- How can I view log files in Linux and apply custom filters while viewing?
- less(1) 手册页
根据评论:如果 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.