如何在Bash中增加中缀变量?

如何在Bash中增加中缀变量?,bash,awk,pipe,Bash,Awk,Pipe,我有一个字符串foo-0,我想将其转换为bar1baz,即解析尾随索引并添加前缀/后缀。尾随索引之前的部分(在本例中为foo-)也可以包含数字字符,但这些字符不应更改 我尝试了以下方法: echo foo-0 | cut-d'-'-f2 | sed's/*/bar&baz/' 但这只提供了部分解决方案(bar0baz)。如何增加中缀变量 编辑:下面的解决方案对于我试图实现的目标只起到部分作用。这是我的错,因为为了清晰起见,我过于简化了上面的示例 最终目标是使用bash使用以下语法将环境变量(我

我有一个字符串
foo-0
,我想将其转换为
bar1baz
,即解析尾随索引并添加前缀/后缀。尾随索引之前的部分(在本例中为
foo-
)也可以包含数字字符,但这些字符不应更改

我尝试了以下方法:

echo foo-0 | cut-d'-'-f2 | sed's/*/bar&baz/'
但这只提供了部分解决方案(
bar0baz
)。如何增加中缀变量

编辑:下面的解决方案对于我试图实现的目标只起到部分作用。这是我的错,因为为了清晰起见,我过于简化了上面的示例

最终目标是使用bash使用以下语法将环境变量(我们称之为
MY_ENV
)设置为输出值:

/bin/sh-c“echo$var |…(一些bash魔法用来替换尾部索引)|…(一些bash魔法用来设置MY_ENV=管道的输出)”
旁注:我之所以使用
/bin/sh-c“…”
是因为我想在Kubernetes YAML中使用该命令

部分解决方案(使用
awk

这项工作:

echo foo-0 | awk-F-“{print”bar“$2+1”baz}”
这不会(输出为
1baz
):

/bin/sh-c“echo foo-0 | awk-F-”{print\“bar\”$2+1\“baz\”}
部分解(使用算术上下文和参数展开)

$var=foo-0
$echo“条$(${var//[![:digit:]}+1))baz”

如果
var
在尾随索引之前包含其他数字字符(例如,对于
var foo=r2a-foo-0

您可以使用
awk

awk -F- '{print "bar" $2+1 "baz"}' <<< 'foo-0'

您可以使用算术上下文和参数展开:

$ var=foo-0
$ echo "bar$((${var//[![:digit:]]}+1))baz"
bar1baz
从内部展开:

  • ${var//[![:digit:]}
    var
    中删除所有非数字:

    $ echo "${var//[![:digit:]]}"
    0
    
  • $((blah+1))
    将1添加到变量
    blah

    $ blah=0
    $ echo "$((blah+1))"
    1
    
    或者,我们可以使用内部替换的结果,而不是
    blah

    $ echo "$(( ${var//[![:digit:]]} + 1 ))"
    1
    
  • 最后,把它放在
    bar
    baz
    之间,得到
    bar1baz

对提出的另一种情况进行修改:假设可能有其他数字,我们只希望增加后面的数字,例如

var=2a-foo-21
为此,我们可以使用嵌套参数扩展和扩展glob(
shopt-s extglob
)以及匹配一个或多个
模式的
+(pattern)
模式。注意:

$ echo "${var#"${var%%+([[:digit:]])}"}"
21
外部扩展是
${var#pattern}
,它从
$var
的开头删除
pattern
的最短匹配

它是“从
$var
的末尾删除
+([[:digit:]])
(一个或多个数字)的最长匹配项”。这使我们只剩下尾随数字,递增它们并在前后添加字符串类似于:

$ echo "bar$((${var#"${var%%+([[:digit:]])}"}+1))baz"
bar22baz
这太不可读了,我建议改用正则表达式:

$ re='([[:digit:]]+)$'
$ [[ $var =~ $re ]]
$ echo "bar$((${BASH_REMATCH[1]}+1))baz"
bar22baz

这在使用
/bin/sh-c“echo'foo-1'| awk-F-{print\'bar\$2+1\'baz\'}'
(输出为
1baz
)时不起作用。我更新了问题,提供了有关我需要解决方案的更多细节。您需要使用:
/bin/sh-c“echo'foo-1'| awk-F-{print\'bar\$2+1\'baz\'“
带有转义的
$
以避免调用shell时变量扩展。我将此答案标记为正确,因为它为原始问题提供了最简单的解决方案。当
var
在尾随索引之前包含其他数字字符(例如
r2a-foo-0
)时,这不起作用。”。这是一个先决条件。我相应地更新了问题。@tiefenauer我添加了另一个考虑到这一点的解决方案。请注意,通常不赞成修改问题,使现有答案无效。如果在子shell中设置环境变量,则不会影响父环境。
$ echo "bar$((${var#"${var%%+([[:digit:]])}"}+1))baz"
bar22baz
$ re='([[:digit:]]+)$'
$ [[ $var =~ $re ]]
$ echo "bar$((${BASH_REMATCH[1]}+1))baz"
bar22baz