スペースで区切られた単語のリストがある場合、外部コマンドを実行せずにすべての単語にプレフィックス(またはサフィックス)を追加するにはどうすればよいですか。
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}"
スペースで区切られた単語(単語が単一のスペースで区切られている場合)に対して、次の2つのステップでシェルパラメータ拡張を使用することもできます。
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
プレフィックスとサフィックスを繰り返し追加します。