![无法在 sed 命令的变量中使用转义序列](https://linux22.com/image/88314/%E6%97%A0%E6%B3%95%E5%9C%A8%20sed%20%E5%91%BD%E4%BB%A4%E7%9A%84%E5%8F%98%E9%87%8F%E4%B8%AD%E4%BD%BF%E7%94%A8%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97.png)
我用来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
您可以使用printf
s%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
您需要了解$'...'
shell 的一个功能是编写转义字符。 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'