在bash脚本中转义sed字符串

时间:2013-06-29 16:24:49

标签: bash scripting sed

我是bash和sed的新手。我想取who的输出并缩进每一行,在过程中为用户名着色。这是我到目前为止所做的:

#!/bin/bash
BOLD="\e[1m"
UNBOLD="\e[0m"
GREEN="\e[32m"
DEFAULT="\e[39m"

who | sed "s@\\([a-z_][a-z0-9_]{0,30}\\) \\(.*\\)@\\t$BOLD$GREEN\\1$DEFAULT$UNBOLD\\2@"

现在它只打印输出而不做任何更改。我很确定问题与逃避有关,但我不确定需要什么,什么不需要。

谢谢!

1 个答案:

答案 0 :(得分:2)

你有两个问题。第一个是你的命令没有做你期望的事情。我们先解决这个问题。我想你想用粗体绿色写这个用户,其余的是默认的unbold。这应该更好:

#!/bin/bash
bold="\e[1m"
unbold="\e[0m"
green="\e[32m"
default="\e[39m"
who | sed "s/^\([[:alpha:]_]\+\)\(.*\)/$bold$green\1$default$unbold\2/"

或者它真的更好吗?你看到丑陋的代码而不是漂亮的颜色。这是你的第二个问题。这就是我们解决它的方法:

#!/bin/bash
bold=$'\e[1m'
unbold=$'\e[0m'
green=$'\e[32m'
default=$'\e[39m'
who | sed "s/^\([[:alpha:]_]\+\)\(.*\)/$bold$green\1$default$unbold\2/"

或者,如果您不喜欢ANSI-C quotings

#!/bin/bash
bold=$(echo -e "\e[1m")
unbold=$(echo -e "\e[0m")
green=$(echo -e "\e[32m")
default=$(echo -e "\e[39m")
who | sed "s/^\([[:alpha:]_]\+\)\(.*\)/$bold$green\1$default$unbold\2/"

注意。中使用大写变量名称被认为是非常糟糕的做法。我知道你会看到很多人这样做,但这确实是错的。这就是我降低所有变量的原因。