Adicione cor a linhas específicas de um script bash

2

Estou tentando criar um script "Cryptocurrency news" usando curl e até agora funciona, mas não completamente do jeito que eu pretendia.

Aqui está o código para a parte principal do script:

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'

Estou tentando adicionar cor às linhas que contêm o título e a hora, para facilitar a leitura. Isso tem se mostrado difícil.

Primeiro criei variáveis de cor, assim:

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

Eu tentei adicioná-los ao script de várias maneiras, mas até agora nada deu certo.

Aqui está um exemplo:

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

Eu não consigo nem mostrar a cor. Outro problema é que, mesmo que eu pudesse, não tenho certeza de como adicionar a variável $ {n} para voltar a normalizar o texto ...

Toda a versão "working" do script:

#!/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'

Sou bastante novo no Linux e comecei a escrever bash uma semana atrás hoje, então isso pode até não ser a melhor solução para realizar o que eu pretendo fazer. Até mesmo as partes de trabalho parecem "excessivamente complicadas" e um pouco cortadas juntas. Especialmente as partes da cabeça / cauda, mas isso foi o melhor que consegui.

    
por discipulus 06.02.2018 / 13:17

1 resposta

1

Resposta curta e simples

Use tput setaf $COLOUR_CODE para gerar saída colorida. Substitua $COLOUR_CODE por um inteiro entre 1 e 8 , pertencentes a 8 cores básicas (mapeadas para as sequências \e[31m a \e[38m , respectivamente.

Então, no caso do seu script:

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

Explicações mais detalhadas

Primeiro, nunca use echo para gerar seqüências de escape como "\e[31m" . O comando é um trem-wreck da portabilidade , e seus -n -e switches não são universalmente suportados. Use printf em vez disso:

printf '\e[31m'

Isso vale para outros escapes no estilo C como \n e \t :

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

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

Em segundo lugar, códigos de escape ANSI de codificação rígida não é a melhor maneira de gerar saída colorida. O comando tput(1) existe para este propósito:

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}"

Em terceiro lugar, é importante entender que a saída do terminal colorido não é universal entre sistemas, emuladores de terminal ou hardware. tput pode nem estar disponível em algumas circunstâncias, e confiar no destaque para tornar o texto TTY legível é uma prática ruim.

    
por 06.02.2018 / 13:33