![给子串着色](https://linux22.com/image/218223/%E7%BB%99%E5%AD%90%E4%B8%B2%E7%9D%80%E8%89%B2.png)
我想获取一个字符串并为函数参数传递的部分着色。
考虑一个字符串
str="[Title] Some Description"
然后打电话
glow "[" "]" "$str"
会将方括号着色为蓝色,同时将其余部分保持为默认终端颜色。这意味着Title
和Some Description
将使用默认的终端颜色。
在另一个将单词着色为random
蓝色的示例中,
str="This is some random sentence."
glow "random" "$str"
答案1
这是你想要的?
#!/bin/bash
glow() {
l=$1
r=$2
str=$3
glow_on='\E[37;46;1m'
glow_off='\E[0m'
strl=${str/$l/$glow_on$l}
strlr=${strl/$r/$r$glow_off}
echo -e "$strlr"
}
glow "[" "]" "[Title] Some Description"
答案2
在最近的 Bash(支持patsub_replacement
,这可能意味着 5.2)中,类似这样的东西可能会起作用:
color_me_blue() {
blue=$'\e[1;34m'
normal=$'\e[0m'
pattern="$1"
string="$2"
string=${string//$pattern/$blue&$normal}
echo "$string"
}
color_me_blue '[][]' '[hello] there'
str="This is some random sentence."
color_me_blue 'random' "$str"
第一个参数被视为 shell 模式,并且[][]
是匹配[
or的参数(与匹配三个字母中的任何一个]
相同)。[abc]
如果不支持将替换的字符串放回原处,那就更难了,所以对于较旧的 Bashes,我认为必须付出一个sed
:
sed_me_blue() {
blue=$'\e[1;34m'
normal=$'\e[0m'
regex="$1"
string="$2"
string="$(sed -e "s/$regex/$blue&$normal/" <<< "$string")"
echo "$string"
}
这是更脆弱的,因为必须将模式嵌入到 sed 代码中。至少任何未加引号的斜线都会导致出现问题,并且那里也可能存在注入漏洞。同样在这里,模式是正则表达式而不是 shell 模式,这并不是说它对[][]
.