공백으로 구분된 단어 목록이 있는 경우 외부 명령을 실행하지 않고 모든 단어에 접두사(또는 접미사)를 어떻게 추가할 수 있습니까?
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
접두사와 접미사를 반복해서 추가합니다.