Perl 표현식을 사용한 조건부 색상 지정

Perl 표현식을 사용한 조건부 색상 지정

perl두 개의 명령 과 테스트 파일이 있습니다 test.txt.

$ cat test.txt
aaa bla
bbb foo
#ccc bar
ddd 444

첫 번째 표현식은 또는 빨간색 perl으로 표시됩니다 .aaabbb

cat test.txt | perl -pe "s/(aaa|bbb)/\e[1;31m\1\033[0m/g"

두 번째 표현식은 다음으로 시작하는 모든 줄에 색상을 지정합니다 #.

cat test.txt | perl -pe "s/^(#.*)/\e[0;32m\1\033[0m/g"

이제 다음 속성을 사용하여 이 두 표현식을 하나로 결합해야 합니다.

줄이 로 시작하면 #전체 줄이 녹색으로 표시됩니다. 행이 #빨간색으로 표시되지 않거나 aaa빨간색 bbb을 사용하여 시작되지 않는 경우.

즉, 선이 이미 녹색인 경우(예: 일반적인 주석 선) 나타날 수 있는 aaa색상 을 지정하고 싶지 않습니다 bbb. 그렇지 않으면 빨간색으로 염색하고 싶습니다.

이를 달성하기 위해 두 표현식을 어떻게 결합할 수 있습니까?

답변1

가장 간단한 방법은 다음과 같습니다.

cat test.txt | perl -pe "s/^(#.*)/\e[0;32m\1\033[0m/g || s/(aaa|bbb)/\e[1;31m\1\033[0m/g"

이는 논리 OR 연산자를 사용하여 첫 번째 작업이 실패할 경우에만 두 번째 작업을 실행 ||하도록 Perl에 지시합니다 . s///즉, 다음과 같은 것if (/#/) ... else if (/aaa|bbb/) ...

|| s///필요한 경우 스크립트 끝에 더 추가할 수 있지만 검색 및 색상이 필요한 경우많은게임이 많아지면 라인으로 하면 너무 복잡해집니다. 이 경우 전체 스크립트를 마지막 줄 대신 세미콜론을 사용하여 #! /usr/bin/perl -p한 줄에 하나씩 별도의 스크립트 로 다시 작성하세요 .s///g ||||

예를 들어:

#! /usr/bin/perl -p

s/^(#.*)/\e[0;32m\1\033[0m/g ||
s/(aaa|bbb)/\e[1;31m\1\033[0m/g || 
s/(ccc)/\e[1;34m\1\033[0m/g ;

이렇게 하면 주어진 줄에서 단 하나의 일치 항목만 찾을 수 있으며 첫 번째 일치 항목이 승리한다는 의미입니다. 따라서 위의 긴 스크립트 예에서 "aaa" 또는 "bbb"가 한 줄에 있으면 색상이 지정되지만 "ccc"가 줄에 있으면동일한라인, 아니.

마지막으로 바퀴를 재발명하는 것 같습니다. 텍스트 색상을 지정하기 위한 여러 도구가 이미 존재합니다. 이것강조하다예를 들어 도구. 주로 소스 코드의 구문 강조에 사용되지만 모든 유형의 텍스트에 색상을 지정하는 데에도 사용할 수 있습니다.

관련 정보