如何替换数组中的匹配模式

如何替换数组中的匹配模式

我有一个名为“arr”的数组,它具有以下值 -

post-ro
post-ro-1
post-ro-2

我有这个变量:

str="su scp [email protected]:/etc/bp/pg/pri/user.json /etc/bp/pg/pri"

我想str通过替换pg中存在的值来运行变量中定义的命令arr。中的命令str应运行 3 次(数组的长度),方法是迭代中的值并按顺序将命令中的值arr替换为每个值。pg

所以最终的命令应该是:

su scp [email protected]:/etc/bp/post-ro/pri/user.json /etc/bp/post-ro/pri
su scp [email protected]:/etc/bp/post-ro-1/pri/user.json /etc/bp/post-ro-1/pri
su scp [email protected]:/etc/bp/post-ro-2/pri/user.json /etc/bp/post-ro-2/pri

答案1

使用 GNU xargs,并假设$str包含要传递给的参数的空格分隔列表su,您可以这样做:

print0() {
  [ "$#" -eq 0 ] || printf '%s\0' "$@"
}
IFS=' ' # split on space only
set -o noglob # disable globbing
xargs -r0a <(print0 "${arr[@]}") -I pg -- $str

(不加$str引号会调用 split+glob,此处禁用 glob,并告知 split 仅在空间上拆分)。

如果$str要包含命令的参数su,那么使用数组会更有意义:

str=(
  su scp [email protected]:/etc/bp/pg/pri/user.json /etc/bp/pg/pri
)
xargs -r0a <(print0 "${arr[@]}") -I pg -- "${str[@]}"

然后您无需大惊小怪$IFSnoglob将该字符串拆分为参数。

相关内容