![파일의 특정 문자열에 색상을 지정하는 방법](https://linux55.com/image/6527/%ED%8C%8C%EC%9D%BC%EC%9D%98%20%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90%20%EC%83%89%EC%83%81%EC%9D%84%20%EC%A7%80%EC%A0%95%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
아래와 같이 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
이제는 이것이 여전히 옳지 않은 것 같습니다. 우리가 실제로 해야 할 일은 각 줄이 파란색으로 시작하도록 설정한 다음 각 2
대체 항목이 빨간색으로 시작하고 파란색으로 끝나도록 설정하는 것입니다. 모자 문자는 ^
줄의 시작을 나타내는 정규식입니다. 또한 파이프의 사용 및 재배치에 주의하십시오 cat
.
$ cat Hello.txt | sed "s/^/`echo $BLUE`/" | sed "s/2/`echo $RED`2`echo $BLUE`/g"
서브쉘 변환을 변수 할당으로 이동하여 더 명확하게 만들 수도 있습니다. 존재하지 않는 변수를 사용하려고 시도하지 않도록 문자 RED
와 구별하기 위해 중괄호가 필요합니다 .2
RED2
$ 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
.