为 bash 脚本的特定行添加颜色

为 bash 脚本的特定行添加颜色

我正在尝试使用curl 制作一个“加密货币新闻”脚本,到目前为止它可以工作,但并不完全按照我的预期方式。

这是脚本主要部分的代码:

curl -s https://www.coindesk.com/ \
  | grep '<h3>\|datetime\|<p>' \
  | sed "s/<h3>//;" \
  | sed 's/timeauthor">//;' \
  | cut -d '>' -f2 | cut -d '<' -f1 \
  | head -46 \
  | tail -39 \
  | sed '3G;6G;9G;12G;15G;18G;21G;24G;27G;30G;33G;36G;39G'

我正在尝试为包含标题和时间的行添加颜色,这样会更容易阅读。事实证明这很困难。

首先我创建了颜色变量,如下所示:

n=`echo -en "\e[0m"`
b=`echo -en "\e[1m"`
r=`echo -en "\e[31m"`
a=`echo -en "\e[36m"`

我尝试通过几种方式将它们添加到脚本中,但到目前为止还没有成功。

这是一个例子:

sed "s/<h3>/`echo "${r}${b}`/;" | sed 's/timeauthor">/`echo "${a}`/;'

我什至无法显示颜色。另一个问题是,即使我可以,我也不确定如何添加 ${n} 变量以使文本再次恢复正常......

脚本的整个“工作”版本:

#!/bin/bash

# Color variables
 n=`echo -en "\e[0m"`
 b=`echo -en "\e[1m"`
 r=`echo -en "\e[31m"`
 a=`echo -en "\e[36m"`

# Prints news from coindesk.com
curl -s https://www.coindesk.com/ | grep '<h3>\|datetime\|<p>' | sed "s/<h3>//;" | sed 's/timeauthor">//;' | cut -d '>' -f2 | cut -d '<' -f1 | head -46 | tail -39 | sed '3G;6G;9G;12G;15G;18G;21G;24G;27G;30G;33G;36G;39G'

我对 Linux 相当陌生,一周前的今天开始编写 bash 脚本,所以这甚至可能不是完成我想要做的事情的最佳解决方案。甚至连工作部件也显得“过于复杂”并且有点拼凑在一起。特别是头部/尾部部分,但这是我能想到的最好的。

答案1

简短而简单的答案

用于tput setaf $COLOUR_CODE生成彩色输出。替换为和$COLOUR_CODE之间的整数,属于 8 种基本颜色(分别映射到序列to )。18\e[31m\e[38m

所以对于你的脚本来说:

# Color variables
n=`tput sgr0`
b=`tput bold`
r=`tput setaf 1`
a=`tput setaf 6`

更详细的解释

首先,永远不要使用echo来输出转义序列,例如"\e[31m"。该命令是便携式火车残骸,并且其-n -e开关并未得到普遍支持。改用printf

printf '\e[31m'

这也适用于其他 C 风格的转义,例如\n\t

# Using Bash (Linux)
$ echo "foo\nbar"
foo\nbar

# Using Ksh (*BSD)
$ echo "foo\nbar"
foo
bar

其次,硬编码 ANSI 转义码并不是生成彩色输出的最佳方法。这tput(1)为此目的而存在命令:

tput setaf 2  # Generates green text
tput bold     # Generate bold text
tput sgr0     # Reset those fancy effects

# To use them as variables:
bold=$(tput bold)
green=$(tput setaf 2)
reset=$(tput sgr0)
echo "${bold}HEADING${reset}"

第三,重要的是要了解彩色终端输出在系统、终端仿真器或硬件之间并不通用。tput在某些情况下甚至可能不可用,并且依靠突出显示来使 TTY 文本可读是不好的做法。

相关内容