bash - 在 bash 脚本中转义 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@"

现在它只是打印输出,没有任何更改。我很确定问题与转义有关,但我不确定什么需要它,什么不需要。

谢谢!

最佳答案

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

#!/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/"

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

关于bash - 在 bash 脚本中转义 sed 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17382295/

相关文章:

linux - 如何 grep 监听端口 80 也可以过滤其他端口包含 80,例如 8080 8088 ...?

Bash:如何从输出中删除 xargs 产生的错误消息?

linux - 将字符串插入具有不同扩展名的文件名

html - 如何注释多行html代码?

git - 如何获取 Git 的最新稳定版本号?

Bash 脚本 - 将目录名称与字符串进行比较

python - 寻找 shell 脚本来监视远程 java 进程并在进程被终止时发送电子邮件警报

vba - 为什么对 InvokeVerb ("&Print"的调用不起作用?

java - ScriptEngineManager.getEngineFactories 在 appengine 上不返回任何工厂

bash - GNU sed 中的 -s 选项是什么意思?