使用column命令格式化高亮文本时Oracle Linux 8.5对齐异常求助
问题原因
问题核心是两个系统的column工具版本差异:Ubuntu使用的是较新版本的util-linux包中的column,它会自动忽略ANSI转义字符(颜色代码)的宽度;而Oracle Linux 8.5中的column版本较旧,会把\x1b[1;46m和\x1b[0m这类颜色转义序列当作普通字符计算宽度,直接破坏了第5行的对齐逻辑。
解决方案
方案1:调整管道顺序(最简单有效)
先让column处理纯文本完成对齐,再用sed给指定行添加颜色,这样颜色代码不会影响已计算好的对齐宽度:
echo -e "Name|Age|Gender|Height|Weight John|25|Male|180|75.5 Jane|30|Female|165|55.2 Bob|45|Male|175|85.1 Alice|35|Female|170|62.3 Dave|50|Male|185|92.8 Eve|40|Female|160|50.7 Tom|28|Male|175|70.5 Sue|42|Female|160|58.9 Mike|33|Male|190|81.2" | column -t -s $'|' -o $' | ' -R 2,4,5 | sed -E '5s/^(.*)$/\x1b[1;46m\1\x1b[0m/'
方案2:用awk替代(更灵活可控)
如果需要更精确的格式控制,可以用awk一次性完成对齐和上色,完全规避column的版本差异:
echo -e "Name|Age|Gender|Height|Weight John|25|Male|180|75.5 Jane|30|Female|165|55.2 Bob|45|Male|175|85.1 Alice|35|Female|170|62.3 Dave|50|Male|185|92.8 Eve|40|Female|160|50.7 Tom|28|Male|175|70.5 Sue|42|Female|160|58.9 Mike|33|Male|190|81.2" | awk -F'|' ' BEGIN { # 定义各列宽度(可根据实际内容调整) col1_w=12; col2_w=4; col3_w=7; col4_w=6; col5_w=6 fmt_normal = "%-" col1_w "s | %" col2_w "s | %-" col3_w "s | %" col4_w "s | %" col5_w "s\n" fmt_highlight = "\033[1;46m%-" col1_w "s | %" col2_w "s | %-" col3_w "s | %" col4_w "s | %" col5_w "s\033[0m\n" } NR==5 { printf fmt_highlight, $1, $2, $3, $4, $5 next } { printf fmt_normal, $1, $2, $3, $4, $5 } '
验证思路
可以在两个系统分别执行column --version查看版本差异:Ubuntu的column通常来自util-linux 2.35+,而Oracle Linux 8.5的版本多为util-linux 2.32,旧版本不支持忽略ANSI转义字符宽度的特性。
内容的提问来源于stack exchange,提问作者outon
相关产品推荐
相关产品推荐

