정규식 패턴과 일치하는 줄에서 인쇄 건너뛰기

정규식 패턴과 일치하는 줄에서 인쇄 건너뛰기

패턴과 일치하는 줄에서 인쇄를 건너뛰는 방법. printf새 줄이 다른 패턴과 일치할 때까지 나머지 줄은 해당 줄과 함께 표시됩니다 .

내가 원하는 것은 후속 텍스트의 색상을 나타내는 및 코드 Wht:입니다 Grn:. Blu:따라서 내보내지는 않지만 색상 설정을 변경하는 데 사용됩니다.

이것은 내가 지금까지 가지고 있는 것인데, 채색을 처리하지만 내가 원하는 것을 수행하지 않습니다.

theone ()
 {
  printf '%s\n' "$@"  \
    | while IFS="" read -r vl; do
       if [[ "$vl" =~ ^[[:space:]]*Wht:[[:space:]]*$ ]]; then
         printf '%s%s%s\n' "${wht}" "$vl" "${rst}"
       elif [[ "$vl" =~ ^[[:space:]]*Grn:[[:space:]]*$ ]]; then
         printf '%s%s%s\n' "${grn}" "$vl" "${rst}"
       elif [[ "$vl" =~ ^[[:space:]]*Blu:[[:space:]]*$ ]]; then
         printf '%s%s%s\n' "${blu}" "$vl" "${rst}"
       else
         printf '%s%s%s\n' "${wht}" "$vl" "${rst}"
       fi
      done
 }

이것은 예이다

var="
Grn:
  Some lines in green
  More green lites
  Green light again

Blu:
  Now turning to blue
  And more blue"

theone "$var"

결과는 다음과 같습니다

  Some lines in green
  More green lites
  Green light again

  Now turning to blue
  And more blue

답변1

문제를 해결하는 POSIX 호환 방법은 다음과 같습니다.

#!/bin/sh

# Colour codes
grn=$(tput setaf 2) blu=$(tput setaf 4) wht=$(tput setaf 7)
rst=$(tput sgr0)

theone()
{
    printf '%s\n' "$@" |
        while IFS= read -r vl
        do
            # Strip leading and trailing space
            ns=${vl##[[:space:]]}
            ns=${ns%%[[:space:]]}

            case "$ns" in
                # Look for a colour token
                Wht:)   use="$wht" ;;
                Grn:)   use="$grn" ;;
                Blu:)   use="$blu" ;;

                # Print a line
                *)      printf "%s%s%s\n" "${use:-$wht}" "$vl" "$rst" ;;
            esac
        done
}

를 사용하는 경우 bash생성자를 사용하는 대신 색상 코드를 연관 배열에 넣고 그 안에 있는 항목을 찾을 수도 있습니다 case … esac.

#!/bin/bash

theone()
{
    # Colour codes
    declare -A cc=(
        ['Grn:']=$(tput setaf 2)
        ['Blu:']=$(tput setaf 4)
        ['Wht:']=$(tput setaf 7)
    )
    local rst=$(tput sgr0)

    printf '%s\n' "$@" |
        while IFS= read -r vl
        do
            # Strip spaces
            ns=${vl//[[:space:]]/}

            # Look for a defined token
            if [[ -v cc[$ns] ]]
            then
                # Assign the next colour
                use=${cc[$ns]}
            else
                # Print a line
                printf "%s%s%s\n" "${use:-${cc['Wht:']}}" "$vl" "$rst"
            fi
        done
}

관련 정보