1

我正在尝试从字符串中删除着色代码;例如从:\033[36;1mDISK\033[0m到:DISK

我的正则表达式看起来像这样:\033.*?m所以匹配 '\033' 后跟任意数量的字符,以 'm' 终止

当我搜索模式时,它会找到匹配项;[[ "$var" =~ $regex ]]评估为

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

这是我的完整脚本:

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

if [[ "$var" =~ $regex ]]
then
        echo "matches"
        echo ${var//$regex}
else
        echo "doesn't match!"
fi

问题似乎与匹配正则表达式的任意数量的任何字符部分有关。我可以成功替换DISK,但如果我将其更改为D.*KD.*?K失败。

请注意,在上述所有情况下,模式都声称与字符串匹配,但在替换时失败。现在不太确定该去哪里,任何帮助表示赞赏。

谢谢

4

2 回答 2

1

以下应该做到这一点:

$ 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
于 2013-06-13T13:05:50.293 回答
1

要使用参数扩展替换运算符,您需要使用扩展 glob。

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

分解它:

  • \\033\[- 匹配编码的转义字符和[.
  • *([0-9;])- 匹配零个或多个数字或分号。你可以+([0-9;])用来(更正确?)匹配一个或多个数字或分号
  • m- 尾随m
于 2013-06-13T14:47:51.830 回答