部分文字列の色付け

部分文字列の色付け

文字列を取り、関数引数として渡された部分に色を付けたいと思います。

文字列を考えてみましょう

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"

最初の引数はシェルパターンとして扱われ、orと[][]一致する引数です[(3文字のうちの1つと一致するものと同じ])。[abc]

置換された文字列を再配置するためのサポートがなければ、より困難です。したがって、古いBashの場合は、支払う必要があると思います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コードに含める必要があるため、これはより脆弱です。少なくとも引用符のないスラッシュは問題を引き起こし、そこにも注入の脆弱性がある可能性があります。また、ここではパターンはシェルパターンではなく正規表現なので[][]

関連情報