Make in bash의 adduffix/addprefix와 동일한 작업

Make in bash의 adduffix/addprefix와 동일한 작업

공백으로 구분된 단어 목록이 있는 경우 외부 명령을 실행하지 않고 모든 단어에 접두사(또는 접미사)를 어떻게 추가할 수 있습니까?

Make에는 다음과 같은 구성이 있습니다.

$(addprefix foo,bar baz)
⇒ foobar foobaz

답변1

bash 5.2(현재 베타 버전) 이상을 사용하면 다음을 수행할 수 있습니다.

bash-5.2$ shopt -s extglob patsub_replacement
bash-5.2$ string='foo bar baz'
bash-5.2$ printf '%s\n' "${string//+([^ ])/&suffix}"
foosuffix barsuffix bazsuffix

ksh93과 동일:

printf '%s\n' "${string//+([^ ])/\0suffix}"

또는 zsh:

set -o extendedglob
printf '%s\n' "${string//(#m)([^ ])##/${MATCH}suffix}"

답변2

당신은 그것을 사용할 수 있습니다쉘 매개변수 확장배열의 요소에. 공백으로 구분된 목록을 배열로 변환합니다.

a=(bar baz bat)

그런 다음 확장하고 각 항목의 시작 부분을 접두어로 "바꿉니다".

printf "%s " "${a[@]/#/foo}"

다음을 사용하여 같은 방식으로 접미사를 추가할 수 있습니다 %.

printf "%s " "${a[@]/%/foo}"

공백으로 구분된 단어(단어가 단일 공백으로 구분된 경우)에 대해 다음 두 단계로 셸 매개변수 확장을 사용할 수도 있습니다.

w="bar baz bat"
r="${w/#/foo}"
r="${r// / foo}"

(문자열의 시작 부분을 접두사로 바꾸고 모든 공백을 공백 뒤에 접두사가 오는 문자로 바꿉니다.

활성화 하면 extglob shopt반복되는 공백도 처리할 수 있습니다.

w="bar baz bat"
r="${w/#/foo}"
r="${r//+( )/ foo}"

답변3

공백으로 구분된 문자열에서는 불가능하지만 배열에서는 가능합니다. 공백으로 구분된 문자열을 배열로 변환할 수 있습니다.

공백으로 구분된 단어가 포함된 변수로 시작합니다.

words="foo bar baz"

배열로 변환합니다.

array=($words)

접미사를 추가합니다.

echo -- "${array[@]/%/suffix}"
⇒ foosuffix barsuffix bazsuffix

또는 접두사를 추가하세요.

echo -- "${array[@]/#/prefix}"
⇒ prefixfoo prefixbar prefixbaz

접두사와 접미사를 반복해서 추가합니다.

관련 정보