Bash regex:用任意数量的字符替换字符串

Bash regex:用任意数量的字符替换字符串,regex,linux,string,bash,Regex,Linux,String,Bash,我试图从字符串中删除着色代码;e、 g.从:\033[36;1mDISK\033[0m到:DISK 我的正则表达式如下所示:\033.*.m因此匹配'\033',后跟任意数量的字符,以'm'结尾 当我搜索模式时,它会找到一个匹配项;[[“$var”=~$regex]]计算结果为true 但是,当我尝试替换匹配项时,什么也没有发生,并且返回相同的字符串 以下是我的完整脚本: regex="\033.*?m" var="\033[36;1mDISK\033[0m" if [[ "$var" =~

我试图从字符串中删除着色代码;e、 g.从:
\033[36;1mDISK\033[0m
到:
DISK

我的正则表达式如下所示:
\033.*.m
因此匹配'\033',后跟任意数量的字符,以'm'结尾

当我搜索模式时,它会找到一个匹配项;
[[“$var”=~$regex]]
计算结果为true

但是,当我尝试替换匹配项时,什么也没有发生,并且返回相同的字符串

以下是我的完整脚本:

regex="\033.*?m"
var="\033[36;1mDISK\033[0m"

if [[ "$var" =~ $regex ]]
then
        echo "matches"
        echo ${var//$regex}
else
        echo "doesn't match!"
fi
问题似乎是与正则表达式的任何字符部分的任何数字匹配。我可以成功地替换
磁盘
,但如果我将其更改为
D.*K
D.*K
,则会失败

请注意,在上述所有情况下,模式都声称与字符串匹配,但在替换时失败。现在不太确定如何处理此问题,请提供帮助


谢谢

以下几点可以做到:

$ var="\033[36;1mDISK\033[0m"
$ newvar=$(printf ${var} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
$ echo ${newvar}
返回:

DISK
现在验证

$ echo $var | od
0000000 030134 031463 031533 035466 066461 044504 045523 030134
0000020 031463 030133 005155
0000026
$ echo $newvar | od
0000000 044504 045523 000012
0000005

要使用参数展开替换运算符,需要使用扩展全局

shopt -s extglob
newvar=${var//\\033\[*([0-9;])m}
要分解它:

  • \\033\[
    -匹配编码的转义字符和
    [
  • *([0-9;])
    -匹配零个或多个数字或分号。您可以使用
    +([0-9;])
    来(更正确地?)匹配一个或多个数字或分号
  • m
    -尾随的
    m

${something//something}
不适用于正则表达式。您需要做的是在正则表达式中使用捕获组,然后使用
${BASH\u REMATCH[1]}
以获取第一个捕获的子字符串,依此类推。也许你可以在一开始就不必去掉颜色。你是否尝试过使用
术语
颜色术语
变量?谢谢,这很好,当然是一个比我的努力更完整的正则表达式!我不得不做一个小的调整:
newvar=$(printf${var}|…
newvar=$(printf“${var}”|…
其他情况下,printf只传递句子的第一个单词