제가 개발 중인 프로그램에는 출력에서 색상 코드를 활성화/비활성화하는 옵션이 있습니다.
이 기능이 예상대로 작동하는지 테스트하고 싶습니다. 내가 시도한 것은 다음과 같습니다.
$ myprogram | grep -q '\e[32m' # testing for green color
$ myprogram | grep -q '\e'
$ myprogram | grep -q '\033'
또한 이중 백슬래시를 사용하고 따옴표 없이 동일한 명령을 시도했습니다.
그러나 이들 중 어느 것도 작동하지 않습니다.
내 프로그램의 출력에 색상 코드가 포함되어 있는지 어떻게 테스트할 수 있나요?
답변1
이 grep
명령과 해당 BRE 및 ERE 변형은 ESC를 나타내는 시퀀스를 인식하지 못합니다. Perl 확장(GNU)을 사용 grep -P
하거나 고정 쉘 문자열과 일치해야 합니다.
# string with shell formatting, grep uses fixed string match
( tput setaf 2; echo Green text; tput op ) | grep -Fq $'\033[32' && echo found green
found green
# grep uses Perl's PCRE match to match any colour (change "\d+" to "32" for just green)
( tput setaf 2; echo Green text; tput op ) | grep -Pq '\033\[\d+[;m]' && echo found a colour
found a colour
쉘이 $'...string here...'
문자열 형식을 지원하고 특정 색상만 일치시키려는 경우 이 옵션을 선택하는 것이 좋습니다.
답변2
당신이 할 수 있는 또 다른 일은 'tr'을 사용하여 이스케이프 문자를 다른 것으로 변환하는 것입니다. 특히 ^ 또는 % 또는 심지어 ^A(control-A)와 같은 문자가 있는 경우 grep하다만족스러운 것 같습니다:
boldfoo=$(printf "not bold \033[1mfoo\033[m not bold")
echo $boldfoo
echo $boldfoo | tr '\033' '\001' | grep ^V^A # Type <Ctrl-V><Ctrl-A>
# Use the return value from this to see whether there are escape characters in $boldfoo.
나는 이 트릭을 사용하여 sed/grep을 사용하여 여러 줄 패턴을 찾았습니다. ^A가 된 다음 패턴을 ^A 등과 일치시킵니다. 이제 전체 입력이 한 줄이기 때문에 약간의 트릭이 필요하지만, 약간의 노력이 필요합니다.