配列内で一致するパターンを置き換える方法

配列内で一致するパターンを置き換える方法

次の値を持つ「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回(配列の長さ)実行する必要がありますarrpg

したがって、最終コマンドは次のようになります。

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と、次のようになります。$strsu

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

(引用符をオフにすると$str分割+globが呼び出されます。globは無効になり、分割は空間的にのみ分割するように指示されます。)

$strコマンドに引数を含めるには、配列suを使用する方が合理的です。

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

$IFSこれにより、文字列をパラメータとして分類したり分割したりする必要がなくなりますnoglob

おすすめ記事