我正在尝试从字符串中删除着色代码;例如从:\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.*K
或D.*?K
则会失败。
请注意,在上述所有情况下,模式声称与字符串匹配,但在替换时失败。不太确定现在去哪里,任何帮助表示赞赏。
由于
答案 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
。