정규 표현식과 일치하는 문자열 입력을 기반으로 색상을 지정하는 Bash 함수

정규 표현식과 일치하는 문자열 입력을 기반으로 색상을 지정하는 Bash 함수

Bash 스크립트로 인쇄하는 여러 줄 문자열이 있습니다.

docstring="
 Headings
  -H, -H CNT, -H=CNT, -HCNT, --heading CNT, --heading=CNT

 Warnings
  -W, -W CNT, -W=CNT, -WCNT, --warning CNT, --warning=CNT

 Errors
  -E, -E CNT, -E=CNT, -ECNT, --error CNT, --error=CNT"

echo "$docstring"

-이 문자열을 사용하여 or in color 로 시작하는 줄을 인쇄하는 함수를 만들고 싶습니다 {-.

따라서 다음은 색상이 지정됩니다.

-H, -H CNT, -H=CNT, -HCNT, --heading CNT, --heading=CNT
-W, -W CNT, -W=CNT, -WCNT, --warning CNT, --warning=CNT
-E, -E CNT, -E=CNT, -ECNT, --error CNT, --error=CNT

답변1

GNU를 사용하는 방법, 문자열에 , \또는 문자 가 포함되어 있지 않다고 가정합니다.`"$

printred(){ 
    sed -E 's/^ *\{?-.*/tput setaf 1;printf "%s" "&";tput sgr0/e' <<< "$@"
}

용법:

printred "$docstring"

다른 색상을 선택하려면 다음을 확인하세요.

for i in {0..7}; do
    tput setaf "$i"
    echo "tput setaf $i"
    tput sgr0
done

지침:

CGI 스크립트로 사용하지 말고 비공개로 유지하세요. Stephane Chazelas가 지적했듯이 임의의 명령을 실행할 수 있기 때문입니다. 이는 신뢰할 수 있는 환경에서 사용하기 위한 것입니다. 또는 입력 문자열을 삭제하는 필터를 만드세요.

답변2

GNU와 구현 grep또는 호환 가능 :

grep --color -Ee '^\s*\{?-.*' -e '^' <<< "$docstring"

이는 grep임의 수의 공백 문자로 시작하는 행, 그 뒤에 선택적 문자, 임의 수의 문자 또는 행의 시작 부분이 오고, 출력이 터미널 장치에 도달할 때마다(표시된다고 가정) 일치하는 내용을 핑하는 행 {입니다 -. 이러한 이스케이프 시퀀스를 해석하는 색상이 터미널에 표시됩니다. --color=always출력이 단말 장치로 전송되지 않는 경우에도 색상을 추가하도록 변경할 수 있습니다.

사용되는 속성과 색상(기본적으로 굵은 빨간색)은 $GREP_COLORS환경 변수(이전 )를 통해 $GREP_COLOR제어 됩니다.

grep예를 들어 첨부된 내선 통화를 굵게, 전경은 노란색, 배경은 빨간색으로 GREP_COLORS='mt=1;41;33' grep...만듭니다 .mt

printred일치하는 줄을 빨간색으로 인쇄하는 함수는 다음과 같습니다.

println() { # prints each of its arguments on separate lines
  [ "$#" -eq 0 ] || printf '%s\n' "$@"
}
printred() {
  println "$@" |
    GREP_COLORS='mt=31' grep --color -Ee '^\s*\{?-.*' -e '^'
}

GNUisms에 의존하지 않고 이러한 줄을 강조 표시하는 또 다른 방법은 sed일치하는 줄 주위에 ANSI 이스케이프 시퀀스를 추가하는 것입니다.

ESC=$(printf '\33')
printred() {
  if [ -t 1 ]; then
    println "$@" |
      sed "s/^[[:space:]]*{\{0,1\}-.*/${ESC}[31m&${ESC}[m"
  else
    println "$@"
}

또는 perl대신 sed:

perl -pe 's/^\s*\{?-.*/\e[31m$&\e[m/'

관련 정보