在bash脚本中转义sed字符串

在bash脚本中转义sed字符串,bash,scripting,sed,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@" 现在它只打印输出,没有任何更改。我很确定问题与逃跑有关,但我不

我不熟悉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@"
现在它只打印输出,没有任何更改。我很确定问题与逃跑有关,但我不确定什么需要它,什么不需要


谢谢

您有两个问题。第一个问题是,您的命令没有执行您期望的操作。让我们先解决这个问题。我想你应该用粗体绿色写用户,其余的默认为未绑定。这应该更好:

#!/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/"
或者,如果您不喜欢:


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

关于变量名:有没有什么特别的原因导致这种做法不好?我下面的教程似乎用大写来表示常量,用小写来表示实际变量。@drwhat昨天和今天早上之间有两个问题,关于一些不起作用的脚本。原因是海报(两个不同的人)使用了一个名为
PATH
的变量,因此把一切都搞砸了。如果他们尊重这一点,他们本可以节省几个小时:在中使用小写变量名。
#!/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/"