색상 출력은 사용자 정의 패턴에 따라 다름

색상 출력은 사용자 정의 패턴에 따라 다름

나는 변수의 내용을 인쇄하고 주어진 패턴과 일치하는 모든 줄을 강조 표시하는 bash 함수를 작성하는 데 관심이 있습니다.

awk다음은 변수의 행을 처리 하는 데 사용됩니다 . 그러나 이는 일치하는 패턴에서는 작동하지 않지만 색상을 지정할 행을 지정하면 작동합니다(예: lseq="2,3,5").

aid ()
 {  
  local -r sgr="$( tput sgr0 )"  
  local -r blu="$( tput bold; tput setaf 39 )"
  
  awk -v frg="$blu" -v rst="$sgr" -v lnum="$lseq" ptrn="$rl" \
    'BEGIN { split(lnum, laggr, ",") }
      {
       found = 0
       for (item in laggr) {
         if (laggr[item] == NR) { found = 1 ; break }
        }
       if (found) { print frg $0 rst }
       else { print $0 }
      }' <<< "$@"
 }

edvart예를 들어, 파란색 전경으로 시작하는 줄을 인쇄하려는 다음과 같은 여러 줄 변수가 있습니다 .

rl="^[[:space:]]*edvart .*$"
var="
Here is an example
  edvart -W
Some description
Introduction
Menu
Interactive"

답변1

이 문제를 해결하기 위한 주요 요소는 다음과 같습니다.

  1. tput착색을 위해
  2. 소스 텍스트를 파이프에 넣기
  3. 선 작업

while/를 사용한 솔루션은 다음과 같습니다.read

rst=$( tput sgr0 ) ; hi=$( tput bold; tput setaf 39 )

printf '%s\n' "$source" \
| while read line
do
  if [[ "$line" =~ "$pattern" ]]; then
    printf '%s\n' "${hi}${line}${rst}"
  else
    printf '%s\n' "$line"
  fi
done

구문 은 =~bash에만 적용됩니다. grepif 문에서 이를 사용하고 종료 상태를 활용할 수 있지만 질문에 "bash" 태그를 지정했으므로 여기서는 표시하지 않겠습니다.

해결책은 다음과 같습니다 awk.

rst=$( tput sgr0 ) ; hi=$( tput bold; tput setaf 39 )
printf '%s\n' "$source" \
| awk '{
  if ( $0 ~ /'"$pattern"'/ ) {
    printf "'${hi}'%s'${rst}'\n", $0
  } else {
    print
  }
}'

또 다른 해결책은 다음과 같습니다 sed.

rst=$( tput sgr0 ) ; hi=$( tput bold; tput setaf 39 )
printf '%s\n' "$source" | sed "/$pattern/s/^.*$/${hi}&${rst}/"

awk및 의 경우 sedawk/sed 스크립트에 색상/형식을 기술적으로 포함하고 있습니다. 따라서 실제로 및 변수가 필요하지 않습니다 hi. rst하지만 내 생각엔 그게 더 읽기 쉬운 것 같아.

awk솔루션은 sed솔루션보다 이식성이 뛰어나며 read모든 POSIX 호환 시스템에서 실행될 수 있습니다.

전체 줄이 아닌 일치하는 문자열만 강조 표시하려면 를 사용하는 것이 좋습니다 sed.

rst=$( tput sgr0 ) ; hi=$( tput bold; tput setaf 39 )
printf "$source" | sed "s/$pattern/${hi}&${rst}/g"

관련 정보