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 명령의 출력에는 리터럴이 있습니다.s
e
s
\\
\&
&
\/
/
/
\1
\9
\n
e
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")