Bashスクリプトの特定の行に色を追加する

Bashスクリプトの特定の行に色を追加する

カールを使って「暗号通貨ニュース」スクリプトを作成しようとしています。これまでは機能しますが、予想通りではありません。

以下はスクリプトの主要部分のコードです。

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}`/;'

色を表示することもできません。もう1つの問題は、可能であっても$ {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に初めてアクセスし、1週間前から今日からbashスクリプトの作成を始めました。したがって、これが私がやろうとしていることを実行するのに最適なソリューションではないかもしれません。動作する部分でさえ、「複雑すぎる」ように見え、やや粗雑に見えました。特に頭/尾部分が一番好きでした。

ベストアンサー1

短くて簡単な答え

tput setaf $COLOUR_CODEカラー出力を生成するために使用されます。 8つの基本色の間に属する整数に置き換えられます$COLOUR_CODE(それぞれのシーケンスにマップされます)。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'

\nこれは、次のような他のCスタイルエスケープでも機能します\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テキストを読むことができるように強調表示に頼ることは悪い習慣です。

おすすめ記事