sed 명령의 변수에는 이스케이프 시퀀스를 사용할 수 없습니다.

sed 명령의 변수에는 이스케이프 시퀀스를 사용할 수 없습니다.

sed명령 출력에서 ​​열을 강조 표시하는 데 사용 ps하고 색상 코드를 하드코딩하면 제대로 작동합니다. 다만 색상이 동적으로 표현되어야 해서 변수로 옮겨서 sed 명령어에서 해당 변수를 참조하려고 해보았으나 전혀 동작하지 않는 것 같습니다.

# Works
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head  | sed -e $'s/ *[^ ]* /\033[1;33m&\033[0m/6'

그러나 \033[1;33m및를 \033[0m변수로 이동하고 이를 명령에서 참조하면(여러 가지 방법) 전혀 작동하지 않습니다.

# None of the following work
fg_normal="\033[0m"
fg_yellow="\033[1;33m"

ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head  | sed -e $'s/ *[^ ]* /'$fg_yellow'&'$fg_normal'/6'
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head  | sed -e $'s/ *[^ ]* /'"$fg_yellow"'&'"$fg_normal"'/6'
ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head  | sed -e $"s/ *[^ ]* /$fg_yellow&$fg_normal/6"

어떤 아이디어가 있나요?

답변1

당신이 사용할 수있는:

fg_normal=$(echo -e "\033[0m")
fg_yellow=$(echo -e "\033[1;33m")

또는 tput을 사용하십시오:

fg_normal=$(tput sgr0)
fg_yellow=$(tput setaf 3)

답변2

printfs %b지정자를 사용하여 올바른 백슬래시 이스케이프 시퀀스를 유지하면서 sed 명령을 조합 할 수 있습니다 .

ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu | head  | 
    sed -e "$(printf 's/ *[^ ]* /%b&%b/6' "$fg_yellow" "$fg_normal")"

답변3

이해해야 할 쉘의 기능 중 하나 $'...'는 이스케이프 문자를 작성하는 것입니다. A $'\033'는 진정한 탈출이다 ESC.

$' '따라서 sed 명령 내부에서 이동해야 합니다.

sed -e $'s/ *[^ ]* /\033[1;33m&\033[0m/6'

실제 변수의 경우 다음을 사용합니다.

fg_normal=$'\033[0m'
fg_yellow=$'\033[1;33m'

이 간단한 변경을 통해 ( $'지금은 필요하지 않음) 작동합니다(작은따옴표 안팎의 올바른 인용 관찰 ').

ps -eo pid,ppid,time,user,tty,%cpu,%mem,vsize,command --sort -%cpu |
head -n 10  |
sed -e 's/ *[^ ]* /'"$fg_yellow"'&'"$fg_normal"'/6'

관련 정보