我有一个看起来像
的bash变量aaa-bb-cccc-r17, m12w_pp_r2, z-r123, etc.
我希望将所有内容提取到(最终)-rNNN(任意位数),换句话说,删除最终的-rNNN。如果变量不以-r结尾,后跟数字,我想保持不变。
我尝试了$ {the_variable%-r [0-9] *}但事实证明*是shell *(“匹配任何东西”)而不是正则表达式*(“匹配前一个元素出现的任意数量) “)。使用+代替*(“一个或多个”)没有任何匹配。
任何解决方案(沿着这条线或任何其他方式)?
答案 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"