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

색상을 표시할 수도 없습니다. 또 다른 문제는 가능하더라도 ${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컬러 출력을 생성하는 데 사용됩니다 . 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 텍스트를 읽을 수 있도록 강조 표시에 의존하는 것은 나쁜 습관입니다.

관련 정보