gpt4 book ai didi

bash - pretty-print 列中的颜色转义码

转载 作者:行者123 更新时间:2023-11-29 08:54:45 25 4
gpt4 key购买 nike

我有一个制表符分隔的文本文件,我将其发送到 column “漂亮地打印”一张表格。

原始文件:

1<TAB>blablablabla<TAB>aaaa bbb ccc
2<TAB>blabla<TAB>xxxxxx
34<TAB>okokokok<TAB>zzz yyy

使用 column -s$'\t' -t <original file> , 我得到

1  blablablabla aaaa bbb xxx
2 blabla xxxxxx
34 okokokok zzz yyy

随心所欲。现在我想给列添加颜色。我试图在原始文件中的每个制表符分隔字段周围添加转义码。 column成功打印彩色,但列不再对齐。相反,它只是逐字打印 TAB 分隔符。

问题是:我怎样才能使列对齐,而且还具有独特的颜色?

我想到了两种方法来实现这一点:

  1. 调整 column使对齐与颜色代码一起工作的参数
  2. 将列的输出重定向到另一个文件,并对前两个以空格分隔的字段执行搜索+替换(前两列保证包含空格;第三列最有可能将包含空格,但不包含 TAB 字符)

问题是,我不确定该怎么做...

作为引用,这是我传递给 column 的内容:

Original file with color codes

请注意,字段确实由 TAB 字符分隔。我已经用 od 确认了这一点.

编辑:

着色似乎没有问题。我已经有了上面显示的带有颜色代码的文件。问题是 column一旦我发送带有转义码的输入,它就不会对齐。我正在考虑将 不带 颜色代码的字段传递给 column , 然后复制确切的空格数 column每个字段之间的输出,并在 pretty-print 方案中使用它。

最佳答案

我写了一个 bash 版本的专栏(类似于 util-linux 的专栏),它使用颜色代码:

#!/bin/bash
which sed >> /dev/null || exit 1

version=1.0b
editor="Norman Geist"
last="04 Jul 2016"

# NOTE: Brilliant pipeable tool to format input text into a table by
# NOTE: an configurable seperation string, similar to column
# NOTE: from util-linux, but we are smart enough to ignore
# NOTE: ANSI escape codes in our column width computation
# NOTE: means we handle colors properly ;-)

# BUG : none

addspace=1
seperator=$(echo -e " ")
columnW=()
columnT=()

while getopts "s:hp:v" opt; do
case $opt in
s ) seperator=$OPTARG;;
p ) addspace=$OPTARG;;
v ) echo "Version $version last edited by $editor ($last)"; exit 0;;
h ) echo "column2 [-s seperator] [-p padding] [-v]"; exit 0;;
* ) echo "Unknow comandline switch \"$opt\""; exit 1
esac
done
shift $(($OPTIND-1))

if [ ${#seperator} -lt 1 ]; then
echo "Error) Please enter valid seperation string!"
exit 1
fi

if [ ${#addspace} -lt 1 ]; then
echo "Error) Please enter number of addional padding spaces!"
exit 1
fi

#args: string
function trimANSI()
{
TRIM=$1
TRIM=$(sed 's/\x1b\[[0-9;]*m//g' <<< $TRIM); #trim color codes
TRIM=$(sed 's/\x1b(B//g' <<< $TRIM); #trim sgr0 directive
echo $TRIM
}

#args: len
function pad()
{
for ((i=0; i<$1; i++))
do
echo -n " "
done
}

#read and measure cols
while read ROW
do
while IFS=$seperator read -ra COLS; do
ITEMC=0
for ITEM in "${COLS[@]}"; do
SITEM=$(trimANSI "$ITEM"); #quotes matter O_o
[ ${#columnW[$ITEMC]} -gt 0 ] || columnW[$ITEMC]=0
[ ${columnW[$ITEMC]} -lt ${#SITEM} ] && columnW[$ITEMC]=${#SITEM}
((ITEMC++))
done
columnT[${#columnT[@]}]="$ROW"
done <<< "$ROW"
done

#print formatted output
for ROW in "${columnT[@]}"
do
while IFS=$seperator read -ra COLS; do
ITEMC=0
for ITEM in "${COLS[@]}"; do
WIDTH=$(( ${columnW[$ITEMC]} + $addspace ))
SITEM=$(trimANSI "$ITEM"); #quotes matter O_o
PAD=$(($WIDTH-${#SITEM}))

if [ $ITEMC -ne 0 ]; then
pad $PAD
fi

echo -n "$ITEM"

if [ $ITEMC -eq 0 ]; then
pad $PAD
fi

((ITEMC++))
done
done <<< "$ROW"
echo ""
done

示例用法:

bold=$(tput bold)
normal=$(tput sgr0)
green=$(tput setaf 2)

column2 -s § << END
${bold}First Name§Last Name§City${normal}
${green}John§Wick${normal}§New York
${green}Max§Pattern${normal}§Denver
END

输出示例:

enter image description here

关于bash - pretty-print 列中的颜色转义码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20151601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com