【问题标题】:psql displaying ansi colored textpsql 显示 ansi 彩色文本
【发布时间】:2016-02-25 08:07:38
【问题描述】:

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

输出应该是这样的,

【问题讨论】:

    标签: postgresql shell terminal psql less-unix


    【解决方案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'     本身而不是文字。
    • | less -R     less(1)(psql 不会为我们做这件事,因为我们接管了stdout 的控制权!)。提供给less(1) 的选项由您决定;只要它们包含-R(或-r),就会发生着色。

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

    【讨论】:

      【解决方案2】:

      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($1))|ge\' | less'
      

      【讨论】:

      • Tnx,这对我有用export LESSOPEN='|perl -pe "s|\\\(x..)|chr(hex(\$1))|ge" %s'
      • 不幸的是它只能在shell下工作,但在使用psql时不能。
      • 如果将命令放入脚本中,则可以绕过转义和引用的问题。
      • 当 psql 通过管道调用 less 时,转义没有问题,而且我注意到 LESSOPEN 在这种情况下不起作用,即。 cat ansi_file.txt | less -r less -r ansi_file.txt 按预期工作。
      猜你喜欢
      • 2020-03-15
      • 2011-07-22
      • 2011-09-29
      • 2017-04-19
      • 2015-08-23
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 2016-08-17
      相关资源
      最近更新 更多