나는 변수의 내용을 인쇄하고 주어진 패턴과 일치하는 모든 줄을 강조 표시하는 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
이 문제를 해결하기 위한 주요 요소는 다음과 같습니다.
tput
착색을 위해- 소스 텍스트를 파이프에 넣기
- 선 작업
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에만 적용됩니다. grep
if 문에서 이를 사용하고 종료 상태를 활용할 수 있지만 질문에 "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
및 의 경우 sed
awk/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"