perl
두 개의 명령 과 테스트 파일이 있습니다 test.txt
.
$ cat test.txt
aaa bla
bbb foo
#ccc bar
ddd 444
첫 번째 표현식은 또는 빨간색 perl
으로 표시됩니다 .aaa
bbb
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"가 줄에 있으면동일한라인, 아니.
마지막으로 바퀴를 재발명하는 것 같습니다. 텍스트 색상을 지정하기 위한 여러 도구가 이미 존재합니다. 이것강조하다예를 들어 도구. 주로 소스 코드의 구문 강조에 사용되지만 모든 유형의 텍스트에 색상을 지정하는 데에도 사용할 수 있습니다.