Bash regex:用任意数量的字符替换字符串
我试图从字符串中删除着色代码;e、 g.从: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" =~
\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只传递句子的第一个单词