Bash 색상 출력 실패

Bash 색상 출력 실패

sed나 echo에 문제가 있나요? 내가 뭘 잘못했나요?

$> cat ~/bin/color_test.sh 
#!/bin/bash

ColorOff='\e[0m'       # Text Reset
BWhite='\e[1;37m'      # Bold White

string="test TEST test"
echo -e "$string" | sed -e "s/TEST/${BWhite}TEST${ColorOff}/g"

$> ~/bin/color_test.sh 
test e[1;37mTESTe[0m test

굵은 글씨로 강조된 테스트가 예상됩니다.

답변1

sed\e이스케이프 시퀀스 로 간주되지 않습니다 . GNU sed 및 대부분의 다른 sed 구현의 경우 \e대체 텍스트의 의미는 입니다. 대체 텍스트에서 이식 가능하게 사용할 수 있는 유일한 백슬래시 이스케이프 문자는 리터럴을 의미하는 백슬래시입니다. (구분 기호는) 리터럴을 나타내고 역참조를 나타냅니다. . GNU sed 및 BusyBox(OpenBSD sed 제외)는 줄바꿈을 추가합니다. 따라서 sed 명령의 출력에는 리터럴이 있습니다.ses\\\&&\///\1\9\ne

Bash에서는 처음부터 리터럴 이스케이프 문자를 변수에 쉽게 추가할 수 있습니다. \e구문에서 인식하는 이스케이프 시퀀스 중 하나입니다 $'…'.

ColorOff=$'\e[0m'       # Text Reset
BWhite=$'\e[1;37m'      # Bold White

답변2

명령에 두 가지 문제가 있습니다 echo.

간결함을 위해 변수를 확장했습니다.

$ echo -e "test TEST test" | sed -e "s/TEST/\e[1;37mTEST\e[0m/g"
test e[1;37mTESTe[0m test

첫 번째 문제: sed 매직과 쉘 매직 사이에 백슬래시가 없습니다. 당신은 그들로부터 탈출해야합니다.

$ echo -e "test TEST test" | sed -e "s/TEST/\\e[1;37mTEST\\e[0m/g"
test e[1;37mTESTe[0m test

아니면 아닙니다. 어쩌면 탈출에 더 가깝나요?

$ echo -e "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g"
test \e[1;37mTEST\e[0m test

마지막으로 백슬래시가 나타납니다. 왜 세 개의 백슬래시가 필요한지 모르겠습니다. 이상한 sed 마법입니다.

두 번째 문제: echo -e의미가 없습니다. -e백슬래시 이스케이프 해석을 활성화하지만 echo -e해석할 수 있는 것은 "test TEST test"sed에서 나오는데, 백슬래시 이스케이프는 신경 쓰지 않고 직접 인쇄합니다.

당신이 원하는 것은 다음과 같습니다.

$ echo -e $(echo "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g")
test TEST test

출력에는 TEST가 굵게 표시되어 있습니다.

변경 사항이 포함된 전체 스크립트는 다음과 같습니다.

#!/bin/bash

ColorOff='\\\e[0m'       # Text Reset
BWhite='\\\e[1;37m'      # Bold White

string="test TEST test"
echo -e $(echo "$string" | sed -e "s/TEST/${BWhite}TEST${ColorOff}/g")

관련 정보