给子串着色

给子串着色

我想获取一个字符串并为函数参数传递的部分着色。

考虑一个字符串

str="[Title] Some Description"

然后打电话

glow "[" "]" "$str"

会将方括号着色为蓝色,同时将其余部分保持为默认终端颜色。这意味着TitleSome 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 模式,这并不是说它对[][].

相关内容