배열에서 일치하는 패턴을 바꾸는 방법

배열에서 일치하는 패턴을 바꾸는 방법

다음과 같은 값을 갖는 "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가정하면 다음과 같이 할 수 있습니다.$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.

관련 정보