【发布时间】:2012-09-28 01:44:00
【问题描述】:
我有一个包含三个段落的文本文件。我想使用 bash 脚本命令以不同的颜色显示不同的段落。第 1 段为红色,第 2 段为蓝色,第 3 段为青色。
我设法使用诸如
之类的命令以彩色显示线条echo -e '\E[32;47m Green.'; tput sgr0
但是,我想解析我的文件并在有新段落时更改颜色。我会很感激一些提示。
【问题讨论】:
我有一个包含三个段落的文本文件。我想使用 bash 脚本命令以不同的颜色显示不同的段落。第 1 段为红色,第 2 段为蓝色,第 3 段为青色。
我设法使用诸如
之类的命令以彩色显示线条echo -e '\E[32;47m Green.'; tput sgr0
但是,我想解析我的文件并在有新段落时更改颜色。我会很感激一些提示。
【问题讨论】:
输入/tmp/FILE:http://pastie.org/4928415
脚本:
#!/bin/bash
c=1
tput setaf $c
while read a; do
[[ $a =~ ^$ ]] && tput setaf $((++c))
echo "$a"
done < /tmp/FILE
tput sgr0
输出:
【讨论】:
这是一个 awk 解决方案,它依次使用一组颜色设置的元素:
BEGIN { nc = split("\33[31;47m \33[34;43m \33[36;40m", colors, " ");
c=1; print colors[c] }
{ print }
/^$/ { c = 1+(c%nc); print colors[c]}
[编辑:上面错误地在段落之间添加了一个额外的空白行。更正后的代码如下:
BEGIN { nc = split("\33[31;47m \33[34;43m \33[36;40m", colors, " ");
c=1; printf "%s", colors[c] }
/^$/ { c = 1+(c%nc); print colors[c]}
!/^$/
!/^$/ 会导致任何非空行按原样打印。 (结束编辑)]。
如果上面的内容在文件 3-para.awk 中并且数据在文件 3-para.data 中,请使用类似awk -f 3-para.awk 3-para.data 的命令来获取如下输出。
为了更方便使用,定义一个调用脚本然后将颜色重置为默认值的函数:
tricolor() {
awk -f 3-para.awk $1; tput sgr0
}
通过(例如)tricolor 3-para.data 使用该功能
【讨论】: