Bash正则表达式:用任意数量的字符替换字符串

时间:2013-06-13 12:09:17

标签: regex linux string bash

我正在尝试从字符串中删除着色代码;例如从:\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

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

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

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

要打破它:

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