파일의 특정 문자열에 색상을 지정하는 방법

파일의 특정 문자열에 색상을 지정하는 방법

아래와 같이 Hello.txt 파일을 준비했습니다.

1253125213
213532135
23513125215

그런 다음 "2" 파란색과 "2" 빨간색을 제외한 모든 행에 색상을 지정하고 싶습니다.

처음에는 글을 썼는데

BLUE='\033[0;34m'
RED='\033[0;31m'

그리고 그렇게 하려고 노력했지만 sed 's/2/${RED}2${BLUE}/', 효과가 없었습니다.

어떻게 해야 하나요?

답변1

첫째, 보간할 때 큰따옴표가 필요합니다.

$ sed "s/2/${RED}2${BLUE}/" Hello.txt
1233[0;31m2233[0;34m53125213
233[0;31m2233[0;34m13532135
233[0;31m2233[0;34m3513125215

그러나 ASCII 이스케이프 시퀀스에는 sed에 영향을 미치는 문자가 포함되어 있으므로 이스케이프 문자 시퀀스를 실제 제어 문자로 변환해야 합니다. 이는 서브쉘을 사용하여 수행할 수 있습니다. 마지막 을 참고하세요 /g. 이는 한 줄에 여러 대체가 허용된다는 의미입니다.

$ sed "s/2/`echo $RED`2`echo $BLUE`/g" Hello.txt

컬러 출력 1

이제는 이것이 여전히 옳지 않은 것 같습니다. 우리가 실제로 해야 할 일은 각 줄이 파란색으로 시작하도록 설정한 다음 각 2대체 항목이 빨간색으로 시작하고 파란색으로 끝나도록 설정하는 것입니다. 모자 문자는 ^줄의 시작을 나타내는 정규식입니다. 또한 파이프의 사용 및 재배치에 주의하십시오 cat.

$ cat Hello.txt | sed "s/^/`echo $BLUE`/" | sed "s/2/`echo $RED`2`echo $BLUE`/g"

컬러 출력 2

서브쉘 변환을 변수 할당으로 이동하여 더 명확하게 만들 수도 있습니다. 존재하지 않는 변수를 사용하려고 시도하지 않도록 문자 RED와 구별하기 위해 중괄호가 필요합니다 .2RED2

$ BLUE=`echo '\033[0;34m'`
$ RED=`echo '\033[0;31m'`
$ cat Hello.txt | sed "s/^/$BLUE/" | sed "s/2/${RED}2${BLUE}/g"

원천:http://www.cyberciti.biz/faq/unix-linux-sed-ascii-control-codes-nonprintable/

답변2

ZimbiX가 이미 설명했듯이 큰따옴표 등을 사용하십시오.

그의 접근 방식에 대한 대안은 $'…'이스케이프 시퀀스가 ​​해석되는 구문을 사용하는 것입니다. 즉:

\e    => ASCII ESC (0x1b, 033)
\033  => ASCII ESC (0x1b, 033)
\x1b  => ASCII ESC (0x1b, 033)

그래서:

red=$'\e[31m'
blue=$'\e[34m'

그 다음에:

printf $blue && sed "s/2/${red}2$blue/g" Hello.txt

또는 원하는 경우 다음을 포함하세요.초기화바꾸다:

cc=$'\e[0m'
printf $blue && sed "s/2/$cc${red}2$cc$blue/g" Hello.txt && printf $cc

코드를 보려면 다음을 입력하세요.

(printf $blue && sed "s/2/${red}2$blue/g" Hello.txt) | cat -v

g또한 의 전역 사용에 유의하세요 sed.

관련 정보