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}"

スペースで区切られた単語(単語が単一のスペースで区切られている場合)に対して、次の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

プレフィックスとサフィックスを繰り返し追加します。

関連情報