如何在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
将1添加到变量$((blah+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