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를 사용하는 방법sed, 문자열에 , \
또는 문자 가 포함되어 있지 않다고 가정합니다.`
"
$
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...
만듭니다 .m
t
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/'