如何用Bash正则分组实现仅保留字符串开头的单个冒号?
使用Bash正则分组实现保留字符串开头单个冒号
完全可以用Bash的[[ $string =~ regex ]]语法结合正则分组实现这个需求,效果和你原来的sed命令完全一致。
具体实现代码如下:
if [[ $string =~ ^(::*)(.*) ]]; then string=":${BASH_REMATCH[2]}" fi
代码解释
- 正则表达式
^(::*)(.*)的作用:^匹配字符串开头位置(::*)捕获分组1:匹配开头连续的一个或多个冒号(::*等价于:+,用::*无需额外开启扩展正则,兼容性更好)(.*)捕获分组2:匹配开头冒号之后的所有剩余内容
${BASH_REMATCH[2]}是Bash内置的匹配结果数组,索引2对应第二个分组的内容,用单个冒号拼接该内容,就实现了将开头连续冒号替换为单个冒号的效果。
测试示例
- 原字符串:
:::hello world→ 处理后::hello world - 原字符串:
:test→ 处理后::test(本身只有单个开头冒号,无变化) - 原字符串:
no-colon-here::→ 处理后:no-colon-here::(冒号不在开头,不做处理)
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

