从bash变量中删除正则表达式

时间:2016-03-10 01:40:51

标签: regex bash

我有一个看起来像

的bash变量
aaa-bb-cccc-r17, m12w_pp_r2, z-r123, etc.

我希望将所有内容提取到(最终)-rNNN(任意位数),换句话说,删除最终的-rNNN。如果变量不以-r结尾,后跟数字,我想保持不变。

我尝试了$ {the_variable%-r [0-9] *}但事实证明*是shell *(“匹配任何东西”)而不是正则表达式*(“匹配前一个元素出现的任意数量) “)。使用+代替*(“一个或多个”)没有任何匹配。

任何解决方案(沿着这条线或任何其他方式)?

2 个答案:

答案 0 :(得分:3)

您可以通过扩展模式支持来实现此目的。

$ shopt -s extglob
$ the_variable=aaa-bb-cccc-r17
$ echo "${the_variable%-r+([0-9])}"
aaa-bb-cccc

答案 1 :(得分:1)

如你发现参数扩展不能直接在这里做你想做的事。

您可以玩游戏,将所有内容都剥离到值中的最后-,然后检查剩余的字符串是否与您想要的模式匹配,但此时您也可以直接进行模式匹配并完成

$ pat='(.*)-r[0-9]*$'
$ var='aaa-bb-cccc-r17, m12w_pp_r2, z-r123'
$ [[ $var =~ $pat ]] && var=${BASH_REMATCH[1]}
$ declare -p var
declare -- var="aaa-bb-cccc-r17, m12w_pp_r2, z"
$ var='aaa-bb-cccc-r17, m12w_pp_r2, z-r123g'
$ [[ $var =~ $pat ]] && var=${BASH_REMATCH[1]}
$ declare -p var
declare -- var="aaa-bb-cccc-r17, m12w_pp_r2, z-r123g"