패턴과 일치하는 줄에서 인쇄를 건너뛰는 방법. 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
}